Определение правильного потока для отладки в GDB - PullRequest
9 голосов
/ 19 июля 2010

Я столкнулся с некоторыми проблемами при отладке многопоточного процесса с использованием GDB. У меня есть многопоточный процесс, который разделяется на несколько (8 или 9) разных потоков, и я пытаюсь определить, каково содержимое переменных, когда вызывается конструктор для класса с именем XML_File_Data. Однако я столкнулся с проблемой, когда после применения правильной точки останова функции ко всем потокам, и становится очевидно, что одна из точек останова потока получает удар (программа временно останавливает выполнение), я не могу определить, какой поток достичь точки останова Команда

(gdb) thread apply all where

дает мне шокирующе бесполезную информацию в форме:

#0  0x004ab410 in __kernel_vsyscall ()
#1  0x05268996 in nanosleep () from /lib/libc.so.6
#2  0x052a215c in usleep () from /lib/libc.so.6
#3  0x082ee313 in frame_clock_frame_end (clock=0xb4bfd2f8)
    at frame_clock.c:143
#4  0x003a349a in ?? ()
#5  0x00b5cfde in thread_proxy ()
   from /cets_development_libraries/install/lib/libboost_thread-gcc41-mt-1_38.so.1.38.0
#6  0x02c1f5ab in start_thread () from /lib/libpthread.so.0
#7  0x052a8cfe in clone () from /lib/libc.so.6

Из 9 процессов 7 или около того дают мне почти точно такой вывод, и информация о последних 2 не очень полезна (функции, расположенные далеко внизу стека вызовов, имеют распознаваемые имена, но все последние # 4 функции не распознаются).

Это то, что я имею до сих пор:

(gdb) gdb
(gdb) gdb attach <processid>
(gdb) thread apply all 'XML_File_Data::XML_File_Data()'

и (после достижения точки останова)

(gdb) thread apply all where

Могут ли опытные отладчики подсказать мне, что я делаю неправильно или что обычно делают в этой ситуации?

Ура, Charlie

РЕДАКТИРОВАТЬ: К счастью, я смог выяснить, что причиной оптимизированного кода было выполнение через отладчик, в дополнение к тому, что он не запускался в каталоге исполняемого файла. Тем не менее, с отладкой успехов не так много.

Ответы [ 2 ]

17 голосов
/ 02 марта 2012

Я постоянно этим занимаюсь:

> t a a f

Сокращение от:

> thread apply all frame

Конечно, возможны и другие варианты:

> t a a bt 3

Который печатает нижние 3 кадра стека каждого потока.(Вы также можете использовать отрицательные числа, чтобы получить верхние N кадров в стеке)

15 голосов
/ 20 июля 2010

Вы можете использовать команду thread или info threads , чтобы узнать номер текущего потока после достижения точки останова

(gdb) thread
[Current thread is 1 (Thread 0xb790d6c0 (LWP 2519))]
(gdb)

(gdb) info threads
  17 Thread 0xb789cb90 (LWP 2536)  0xb7fc6402 in __kernel_vsyscall ()
  16 Thread 0xb769bb90 (LWP 2537)  0xb7fc6402 in __kernel_vsyscall ()
  15 Thread 0xb749ab90 (LWP 2543)  0xb7fc6402 in __kernel_vsyscall ()
  14 Thread 0xb7282b90 (LWP 2544)  0xb7fc6402 in __kernel_vsyscall ()
  13 Thread 0xb5827b90 (LWP 2707)  0xb7fc6402 in __kernel_vsyscall ()
  12 Thread 0xb5626b90 (LWP 2708)  0xb7fc6402 in __kernel_vsyscall ()
  11 Thread 0xb5425b90 (LWP 2709)  0xb7fc6402 in __kernel_vsyscall ()
  10 Thread 0xb5161b90 (LWP 2713)  0xb7fc6402 in __kernel_vsyscall ()
  9 Thread 0xb4ef9b90 (LWP 2715)  0xb7fc6402 in __kernel_vsyscall ()
  8 Thread 0xb4af7b90 (LWP 2717)  0xb7fc6402 in __kernel_vsyscall ()
  7 Thread 0xb46ffb90 (LWP 2718)  0xb7fc6402 in __kernel_vsyscall ()
  6 Thread 0xb44feb90 (LWP 2726)  0xb7fc6402 in __kernel_vsyscall ()
  5 Thread 0xb42fdb90 (LWP 2847)  0xb7fc6402 in __kernel_vsyscall ()
  4 Thread 0xb40fcb90 (LWP 2848)  0xb7fc6402 in __kernel_vsyscall ()
  3 Thread 0xb3efbb90 (LWP 2849)  0xb7fc6402 in __kernel_vsyscall ()
  2 Thread 0xb3cfab90 (LWP 2850)  0xb7fc6402 in __kernel_vsyscall ()
* 1 Thread 0xb790d6c0 (LWP 2519)  0xb7fc6402 in __kernel_vsyscall ()
(gdb)

Звездочка `* 'слева от номера потока GDB указывает текущий поток. Смотри здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...