Определение корректного потока для отладки в GDB

Я столкнулся с некоторыми проблемами, отлаживающими многопоточный процесс с помощью 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 не действительно намного более полезна (функции далеко вниз, стек вызовов имеет распознаваемые имена, но любые недавние # 0-#4 функции не являются распознаваемыми).

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

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

и (после того, как точка останова поражена),

(gdb) thread apply all where

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

С наилучшими пожеланиями, Charlie

Править: К счастью, я смог узнать что причина?? был оптимизированный код, выполняемый через отладчик, в дополнение к не выполнению отладчика в каталоге исполняемого файла. Все еще много успеха с отладкой все же.

9
задан candrews 19 July 2010 в 17:37
поделиться

1 ответ

Вы можете использовать команду 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 указывает на текущий поток. См. здесь.

15
ответ дан 4 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: