GDB, как прервать новый поток при отладке многопоточной программы-демона в Linux - PullRequest
0 голосов
/ 08 марта 2019

Прежде чем задать этот вопрос - я упомянул Как многопотоковая отладка gdb согласуется с планированием потоков Linux? для дополнительного контекста

У меня есть многопоточная программа на С ++, работающая на linux.Он запускает поток каждый раз, когда обрабатывает транзакцию.Отлаживаемый код является частью кода обработки транзакций, вызываемого в новом потоке.

Это процесс, которому я следую для отладки.

Я запускаю GDB, выключаю нумерацию страниц, включаю синхронное выполнение команд и устанавливаю нон-стоп режим.

Затем я присоединяю gdb к запущенной программе демона, устанавливаю точки останова во всех потоках (см. Рисунок ниже) и отправляю новую транзакцию.

Проблема заключается в том, что GDB, кажется, четко сообщает мне, что точка останова находится в потоке 1. Я не получаю разрыв на точке останова в новом потоке.Новый поток создается при отправке новой транзакции и завершается без прерывания в точке останова.

Пожалуйста, помогите мне понять, что является возможной причиной (что я упускаю)

(gdb) set pagination off
(gdb) set target-async on
(gdb) set non-stop on
(gdb) attach 11067 # <daemon pid>  
(gdb) thread apply all b foo 
Thread 1 (Thread 0x7f94bb9f3740 (LWP 11067)): Breakpoint 1 at <filename> , 
line <line#>
(gdb) c
 Continuing.
 [New Thread 0x7f94b725e700 (LWP 15750)]
 [Thread 0x7f94b725e700 (LWP 15750) exited]

Проблема в том, что она не сломалась в функции "foo" (моя точка останова)
Чего мне не хватает?Как мне проинструктировать GDB следовать новым дочерним потокам.Разве «thread apply all» не должно применяться ко «всем» потокам?

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Я нашел обходной путь, который работает :-)

Хотя я все еще не могу заставить GDB порваться в точке моего интереса (происходит в недолговечном потоке, порожденном основным потоком), я нашел способ явно переключиться на этот поток достаточно быстро, прежде чем этот поток закончится.

Проблема в том, что gdb требует, чтобы вы явно переключались на интересующий вас поток, чтобы остановиться на точке останова.

, поскольку поток, который я пытался отладить, был довольно коротким, я не могу переключиться на него достаточно быстро (до его завершения).

В дополнение к точке останова в функции моего интереса я установил еще одну точку останова в функции логгера, которая часто возникала во всех потоках и продолжалась (раздражает наверняка), пока поток моего интереса не был порожден, а затем переключен на это явно, когда новый поток был создан и путем перечисления потоков.

(gdb) info threads
(gdb) Thread <thread id>

Я публикую это сообщение, поэтому, если у вас возникла похожая проблема, вы можете попробовать это решение.

Ваши комментарии, лучшие ответы :-) больше ответов приветствуются

0 голосов
/ 08 марта 2019

У меня недостаточно репутации, чтобы комментировать, но в любом случае, если проверить мозг, ваша сессия GDB не показывает, что вы действительно создаете точку останова. из gdb используйте информационные потоки, чтобы увидеть, работает ли ожидаемый поток. Вы можете просто начать с отладчика вместо подключения? начав и прикрепив, вы можете упустить интересную часть. попробуйте установить точку останова на что-то вроде pthread_create (), чтобы увидеть, создается ли ваш поток. есть мои $ 0,02

должен ответить здесь ... если у вас есть доступ к источнику, я установил контрольные точки для фиктивных функций, не вызываемых где-либо еще для удобства. другие вещи, которые я могу подумать, чтобы проверить, вы скомпилировали с символами. является ли он статически связанным (не может сломаться в libc без символов, когда он статически связан). вроде бы кончился бензин, может у кого-то будут идеи получше?

...