varbind management/construction problem
Frank Fock
Frank.Fock____t-online.de
Mon Sep 23 22:08:12 CEST 2002
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