#c #multithreading #eclipse #gdb #gdbserver
#c #многопоточность #eclipse #gdb #gdbserver
Вопрос:
Я использую Eclipse для разработки и удаленной отладки некоторого программного обеспечения для процессора ARM. К сожалению, программное обеспечение, которое я пишу, является многопоточным, и я не могу его отладить. Если я устанавливаю точку останова в коде потока, я получаю следующее сообщение:
Child terminated with signal = 5
Child terminated with signal = 0x5
GDBserver exiting
Немного погуглив, я нашел «решение», предлагающее использовать это:
strip --strip-debug libpthread.so.0
К сожалению, я все еще получаю ошибки завершения.
Я был бы очень признателен за вашу помощь в понимании этого!
Спасибо!
Комментарии:
1. Я не уверен, имеет ли это какое-то отношение к многопоточности, поскольку обычно ее отладка с помощью gdb обычно работает нормально. Как вы вызвали команду strip. The cc1.exe и gcc.exe префиксы странные. Я бы вызвал как обычную команду в bash.
2. @dmeister Это сайт, на котором я нашел «решение» http://sourceware.org/bugzilla/show_bug.cgi?id=8963 Я вызвал это, добавив, что в части other flags C builder в eclipse вызов должен быть:
arm-none-linux-gnueabi-gcc.exe -O0 -g3 -Wall -c -fmessage-length=0 strip --strip-debug libpthread.so.0
3. Можете ли вы попробовать это как отдельный вызов вместо добавления его в the builder. Имейте в виду, что для этого могут потребоваться права root, поскольку это изменяет системный файл (lbpthread.so.0).
4. @dmeister Я добавил это
strip --strip-debug libpthread.so.0
как вызов после сборки, но я продолжаю получать то же сообщение об ошибкеChild terminated with signal = 5
5. Я также попытался добавить ее в .gdbinit и это тоже не сработало. Однако я обнаружил эту дополнительную ошибку:
gdb: error initializing thread_db library
Ответ №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 в Eclipse, или вы можете захотеть запустить GDB из командной строки, чтобы вы точно видели, что она печатает.
Крайне важно, чтобы версия libthread_db.so.0
(для хоста) совпадала с версией lipthread.so.0
(для целевого объекта). Они оба должны быть предоставлены вашим поставщиком набора инструментов.
Ваша проблема, скорее всего, в том, что либо GDB вообще не может найти libthread_db.so.0
, либо в том, что она находит неправильную.
Комментарии:
1. Благодарю вас за эту информацию, при выполнении команды
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)
2. Если я сейчас запущу это из Eclipse, я получу следующую ошибку:
gdb: error initializing thread_db library