Я столкнулся с некоторыми проблемами, отлаживающими многопоточный процесс с помощью 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
Править: К счастью, я смог узнать что причина?? был оптимизированный код, выполняемый через отладчик, в дополнение к не выполнению отладчика в каталоге исполняемого файла. Все еще много успеха с отладкой все же.
Вы можете использовать команду 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 указывает на текущий поток. См. здесь.