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

#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