varbind management/construction problem

Dave Mason dmason____transat-tech.com
Mon Sep 23 22:41:10 CEST 2002


Hi Frank,
MAX_PDUSIZE is 9, since I have 9 varbinds.  I can try increasing it by 
one, but I would be surprised if that made a difference.  That thread 
doesnt have anything else going on besides building traps, so it's 
pretty minimal as it is.  I'm not sure how another method could have a 
side effect - one thing I can try is build the PDU inline instead of 
calling another method.  Maybe something is getting stepped on when I 
make the call.  When in doubt, I guess the thing to do is pull out stuff 
till it works, then put it back in and see where it goes wrong.

Thanks for having a look - I wanted to make sure I wasn't doing anything 
undefined.

Dave

Frank Fock wrote:

> Hi Dave,
>
> Is the constant MAX_PDUSIZE > 1? If this is OK, it seems
> that some other method has a bad side effect on your
> memory. Then your only chance is to reduce the code to
> a minimum to see if it still crashes.
>
> Hope this helps.
>
> Best regards,
> Frank
>
>
> Dave Mason wrote:
>
>> 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