varbind management/construction problem
Dave Mason
dmason____transat-tech.com
Mon Sep 23 21:42:54 CEST 2002
Oops - I just noticed I left out a } when I typed my last mail. The
first version of my run method should look like this:
void
ttiTrapThread::run()
{
Vbx* vbs = new Vbx[MAX_PDUSIZE];
while (running) {
event.wait();
switch (event.type()) {
case COMMS_ALARM:
buildAlarmVb(event, vbs, seqNum); // build varbinds
commsAlarm.generate(vbs, ALARM_PDUSIZE, ""); // send trap
activateAlarm(event, vbs, seqNum); // write to active alarm table
break:
case ....
}
}
delete [] vbs;
}
Later I moved the new/delete inside the while loop but I still get a
crash. I do appreciate your help with this.
Dave
Dave Mason wrote:
> Hi all,
> This is probably some type of C++ programming problem. I hesitated to
> send it to the mailing list, but I've been stuck on it for a while, so
> I thought I'd try my luck.
>
> I have a thread that I start from main() right before the request
> processing loop that handles asynchronous events. It receives them
> from the backend, builds a PDU, sends the trap, and goes back to wait
> for another event. The problem I have is that everything works fine
> for the first event, but it crashes on the second one. It's got to be
> some kind of memory management problem but I havent found it yet. I
> thought I'd send this in case anybody sees that I'm using the methods
> wrong. I have Agent++ version 3.5.3a and Snmp++ version 3.1.6c.
> Maybe a little old, but I dont remember anything in the new change
> logs that relates to this. gcc is version 2.96.
>
> I made two attempts. For the first, I allocate the varbind memory
> once, reuse the structure each time through the loop, and delete the
> whole Vbx array at the end. Here's a quick snapshot of the code:
>
> void
> ttiTrapThread::run()
> {
> Vbx* vbs = new Vbx[MAX_PDUSIZE];
> while (running) {
> event.wait();
> switch (event.type()) {
> case COMMS_ALARM:
> buildAlarmVb(event, vbs, seqNum); // build varbinds
> commsAlarm.generate(vbs, ALARM_PDUSIZE, ""); // send trap
> activateAlarm(event, vbs, seqNum); // write to active alarm table
> break:
> case ....
> }
> delete [] vbs;
> }
>
> void
> ttiTrapThread::buildAlarmVb(event, Vbx* vbs, unsigned long seqNum)
> {
> string oid;
> int n=0;
>
> // determine oid and value
> vbs[n ].set_oid(oid.c_str());
> vbs[n++].set_value(value);
>
> // add more varbinds as needed
> }
>
> void
> ttiTrapThread::activateAlarm(...)
> {
> // MibTableRow* row = tableEntry::instance->add_row(indexOID)
> // call vbs[n].get_value(..) to get values for alarm table
> // call tableEntry::instance->set_row(row, ...) to add values to
> alarm table
> }
>
> I checked the Vbx methods, and they all appear to delete the OID and
> value if the vb is reassigned, so this looked OK. The problem occurs
> when the second event arrives. Vb::set_oid gets called to set the new
> OID, and the crash happens at the delete for the old OID. The crash
> looks like this:
>
> (gdb) where
> #0 0x40410e46 in chunk_free (ar_ptr=0x404c4620, p=0x80d3998) at
> malloc.c:3242
> #1 0x40410bf4 in __libc_free (mem=0x80d39a0) at malloc.c:3154
> #2 0x4027a1f6 in __builtin_delete (ptr=0x80d39a0) from
> /usr/lib/libstdc++-libc6.2-2.so.3
> #3 0x4027a21f in __builtin_vec_delete (ptr=0x80d39a0) from
> /usr/lib/libstdc++-libc6.2-2.so.3
> #4 0x40369d60 in Oid::operator= (this=0x80d0bb8, oid=@0x4094b8cc) at
> oid.cpp:217
> #5 0x4036ef33 in Vb::set_oid (this=0x80d0bb8, oid=0x4094b8cc) at
> vb.cpp:151
> #6 0x08057dab in Agentpp::ttiTrapThread::buildAlarmVb (this=0x0,
> nmEv=@0x4094ba0c, vbs=0x80d0b48, seqNum=1) at ttiTrapThread.cpp:215
> #7 0x08057331 in Agentpp::ttiTrapThread::run (this=0x80d2e10) at
> ttiTrapThread.cpp:139
> #8 0x402eb315 in Agentpp::TaskManager::run (this=0x80d3110) at
> threads.cpp:724
> #9 0x402e9f40 in Agentpp::thread_starter (t=0x80d3138) at
> threads.cpp:472
> #10 0x40244b9c in pthread_start_thread (arg=0x4094bbe0) at manager.c:274
> #11 0x40244c7f in pthread_start_thread_event (arg=0x4094bbe0) at
> manager.c:298
> (gdb)
>
> I tweaked it a few ways, but it always seems to crash in a delete
> operator. The activateAlarm code only reads the PDU without changing
> it, so I dont suspect it.
>
> The biggest change I made was to move the new and delete for vbs
> inside the while loop. In that case, the crash happens in the new
> operator when it's trying to set a new value into an existing Vbx:
>
> (gdb) where
> #0 chunk_alloc (ar_ptr=0x404c4620, nb=32) at malloc.c:2983
> #1 0x40410028 in __libc_malloc (bytes=24) at malloc.c:2811
> #2 0x4027a00d in __builtin_new (sz=24) from
> /usr/lib/libstdc++-libc6.2-2.so.3
> #3 0x4036f2a3 in Vb::set_value (this=0x80d3a4c, ptr=0x80c3940
> "descr") at vb.cpp:224
> #4 0x08057fdc in Agentpp::ttiTrapThread::buildAlarmVb
> (this=0x404c4650, nmEv=@0x4094ba0c, vbs=0x80d3988, seqNum=1) at
> ttiTrapThread.cpp:231
> #5 0x0805732d in Agentpp::ttiTrapThread::run (this=0x80d2df0) at
> ttiTrapThread.cpp:139
> #6 0x402eb315 in Agentpp::TaskManager::run (this=0x80d30f0) at
> threads.cpp:724
> #7 0x402e9f40 in Agentpp::thread_starter (t=0x80d3118) at
> threads.cpp:472
> #8 0x40244b9c in pthread_start_thread (arg=0x4094bbe0) at manager.c:274
> #9 0x40244c7f in pthread_start_thread_event (arg=0x4094bbe0) at
> manager.c:298
> (gdb)
>
> Any ideas? Thanks,
> Dave
>
>
More information about the AGENTPP
mailing list