Удаленная отладка многопоточной C-программы с GDB
Я использую Eclipse для разработки и удаленной отладки программного обеспечения для процессора ARM. К сожалению, программное обеспечение, которое я пишу, является многопоточным, и я не могу его отладить. Если я ставлю точку останова в коде потока, я получаю следующее сообщение:
Child terminated with signal = 5
Child terminated with signal = 0x5
GDBserver exiting
Сделав довольно много Googling, я нашел "решение", которое предложило использовать это:
strip --strip-debug libpthread.so.0
К сожалению, я все еще получаю ошибки завершения.
Я был бы очень признателен за помощь в выяснении этого!
Спасибо!
1 ответ
Во-первых, эта (и последующая) ошибка (и):
cc1.exe: error: unrecognized command line option "-fstrip-debug"
вызвано добавлением strip --strip-debug
и т.д. в командной строке GCC. Это очевидно поддельная вещь, а вовсе не то, что предложила ваша поисковая система. (Возможно, вы захотите очистить свой вопрос, чтобы удалить ссылки на эти ошибки; они не имеют никакого отношения к вашей проблеме.)
То, что он сделал (или должен был) предложить, использует strip --strip-debug libpthread.so.0
вместо использования strip libpthread.so.0
,
Это потому, что GDB не может работать с потоками, если ваш libpthread.so.0 полностью удален.
Это может быть лишено отладочных символов (что к чему strip --strip-debug libpthread.so.0
делает), но лишив его всех символов (вот что strip libpthread.so.0
делает) плохая идея (ТМ).
Так как вы (по-видимому) не сами строите 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 в Eclipse, или вы можете запустить GDB из командной строки, чтобы вы точно видели, что она печатает.
Крайне важно, чтобы версия libthread_db.so.0
(для хоста) соответствует версии lipthread.so.0
(для цели). Они оба должны быть предоставлены вашим поставщиком инструментов.
Ваша проблема, скорее всего, что либо GDB не может найти libthread_db.so.0
или что он находит не тот.