Удаленная отладка многопоточной программы C с помощью GDB

Я использую Eclipse для разработки и удаленной отладки некоторого программного обеспечения для процессора ARM. К сожалению, программное обеспечение, которое я пишу, является многопоточным, и я не могу его отлаживать. Если я помещаю точку останова в код потока, я получаю следующее сообщение:

Child terminated with signal = 5

Child terminated with signal = 0x5

GDBserver exiting

Немного погуглив, я нашел «решение», которое предлагало использовать это:

strip --strip-debug libpthread.so.0

К сожалению, я все еще получаю ошибки завершения.

Буду очень признателен за помощь в разгадке!

Спасибо!


person avivas    schedule 10.06.2011    source источник
comment
Я не уверен, что это как-то связано с многопоточностью, поскольку обычно отладка с помощью gdb обычно работает нормально. Как вы назвали команду раздевания. Префиксы cc1.exe и gcc.exe странные. Я бы назвал обычную команду в bash.   -  person dmeister    schedule 10.06.2011
comment
@dmeister На этом сайте я нашел решение http://sourceware.org/bugzilla/show_bug.cgi?id=8963 Я назвал это так, добавив, что в другой части флагов компоновщика C в eclipse вызывается вызов: arm-none-linux-gnueabi-gcc.exe -O0 -g3 -Wall -c -fmessage-length=0 strip --strip-debug libpthread.so.0   -  person avivas    schedule 10.06.2011
comment
Можете ли вы попробовать это как отдельный вызов вместо того, чтобы добавлять его в файл builder. Имейте в виду, что для этого могут потребоваться права суперпользователя, поскольку он изменяет системный файл (lbpthread.so.0).   -  person dmeister    schedule 10.06.2011
comment
@dmeister Я добавил его strip --strip-debug libpthread.so.0 как вызов после сборки, но постоянно получаю одно и то же сообщение об ошибке Child terminated with signal = 5   -  person avivas    schedule 10.06.2011
comment
Я также пытался добавить его в .gdbinit, но это тоже не сработало. Однако я нашел эту дополнительную ошибку: gdb: error initializing thread_db library   -  person avivas    schedule 10.06.2011


Ответы (1)


Во-первых, эта (и последующие) ошибки:

cc1.exe: error: unrecognized command line option "-fstrip-debug"

вызвано добавлением strip --strip-debug и т. д. в командную строку GCC. Это очевидно фальшивка, и это совсем не то, что предложил ваш поиск в Google. (Возможно, вы захотите очистить свой вопрос, чтобы удалить ссылки на эти ошибки; они не имеют ничего общего с вашей проблемой.)

Что он сделал (или должен был) предложить, так это использовать strip --strip-debug libpthread.so.0 вместо использования strip libpthread.so.0.

Это связано с тем, что GDB не может работать с потоками, если ваш libpthread.so.0 полностью очищен.

Он может быть лишен символов отладки (что делает strip --strip-debug libpthread.so.0), но лишение его всех символов (что делает strip libpthread.so.0) — плохая идея (TM).

Поскольку вы (очевидно) сами не строите libpthread.so.0, вам не нужно его разбирать.

Однако вы должны убедиться, что поставщик вашей цепочки инструментов не напортачил. Следующая команда не должна сообщать no symbols и фактически должна печатать соответствующее nptl_version (как определенный символ):

nm /path/to/target/libpthread.so.0 | grep nptl_version

Предполагая, что до сих пор все в порядке, теперь мы можем диагностировать вашу проблему, за исключением того, что ... вы не предоставили достаточно информации ;-( В частности, когда вы запускаете GDB, он должен напечатать что-то вроде using /path/to/libthread_db.so.0. Возможно, вам придется поискать GDB console в Eclipse, или вы можете запустить GDB из командной строки, чтобы точно видеть, что он печатает.

Крайне важно, чтобы версия libthread_db.so.0 (для хоста) соответствовала версии lipthread.so.0 (для цели). Они оба должны быть предоставлены поставщиком вашей цепочки инструментов.

Ваша проблема, скорее всего, в том, что либо GDB вообще не может найти libthread_db.so.0, либо находит не тот.

person Employed Russian    schedule 10.06.2011
comment
Спасибо за эту информацию, при запуске команды nm /path/to/target/libpthread.so.0 | grep nptl_version на моей цели я получаю следующее: 00011468 r nptl_version Я пытался запустить gdb из командной строки, но он не печатает using /path/libpthread_db_so.0 он печатает только следующее: Process /root/tempSensor created; pid = 988 Listening on port 2345 Remote debugging from host 192.168.34.37 И хост печатает: (gdb) target remote 192.168.34.100:2345 Remote debugging using 192.168.34.100:2345 0x00008110 in ?? () (gdb) - person avivas; 13.06.2011
comment
Если я сейчас запущу это из Eclipse, я получу следующую ошибку: gdb: error initializing thread_db library - person avivas; 13.06.2011