Есть не очень сложная многопоточная программа. Работает под Win и Linux. Под Win все проверено/перепроверено. Никаких утечек и т.д. и т.п. Работает как часы. Под Linux'ом - сваливается. Причем в gdb не могу причину установить ;-)---Type <return> to continue, or q <return> to quit---Program received signal SIGSEGV, Segmentation fault.0x0 in ?? ()(gdb) bt#0 0x0 in ?? ()#1 0x804dd82 in txList::_at_ (this=0xbffffd20, i=0) at txlist.cxx:52#2 0x80495c8 in main (argc=2, argv=0xbffffd64) at ../layer1/inc/txlist.h:115(gdb)
Вот код:
const txListNode* txList::_at_ (int i) const
{
if (i >= entries()) /* !!! Строка 52 */
{
return 0;
}register txListNode* node = _head_._next;
while (i--)
{
node = node->_next;
}return node;
}
int entries (void) const
{
return _entries_;
}Похоже, что стек разрушается, т.к.:
(gdb) disass $eip $eip+20
Dump of assembler code from 0x0 to 0x14:
0x0: Cannot access memory at address 0x0.
(gdb)Но как найти _ГДЕ_ ?
Naskol'ko ya ponimau, entries - eto kolichestvo elementov v spiske. No v multithreaded environment eto kolichestvo mozhet pomenyat'sya iz drugogo thread. Poetomu (ya dazhe ne govoru o locking) - luchshe sdelat' tak:
while(i-- && node) { node=node->_next; }
>Naskol'ko ya ponimau, entries - eto kolichestvo elementov v spiske. No v
>multithreaded environment eto kolichestvo mozhet pomenyat'sya iz drugogo thread. Poetomu (ya
>dazhe ne govoru o locking) - luchshe sdelat' tak:
>while(i-- && node) { node=node->_next; }Этот список заполняется только один раз при старте программы из основного треда и периодически читается только из этого же треда.