URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 840
[ Назад ]

Исходное сообщение
"Помогите отладить..."

Отправлено ki11er , 11-Июл-02 17:42 
Есть не очень сложная многопоточная программа. Работает под 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)

Но как найти _ГДЕ_ ?


Содержание

Сообщения в этом обсуждении
"RE: Помогите отладить..."
Отправлено genie , 12-Июл-02 04:32 
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; }


"RE: Помогите отладить..."
Отправлено ki11er , 12-Июл-02 13:36 
>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; }

Этот список заполняется только один раз при старте программы из основного треда и периодически читается только из этого же треда.