2010-07-19 31 views
9

我遇到了一些使用GDB調試多線程過程的問題。我有一個多線程進程,分裂成幾個(8或9)不同的線程,我試圖確定當調用一個名爲XML_File_Data的類的構造函數時,變量的內容是什麼。但是,我遇到了一個問題,在將正確的函數斷點應用於所有線程之後,顯然線程的某個斷點正在被觸發(程序暫時停止執行)後,我無法確定哪個線程打到了斷點。命令確定在GDB中調試的正確線程

(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 ISN的信息沒有什麼更多的幫助(遠離調用堆棧的函數具有可識別的名稱,但是最近的#0-#4函數是不可識別的)。

這是我到目前爲止有:

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

和(斷點命中後)

(gdb) thread apply all where 

可以在任何有經驗的調試器給我什麼我做錯了或者是什麼的一些提示通常在這種情況下完成?

乾杯, 查理

編輯:幸運的是,我能找到的??的原因進行了優化的代碼正在通過調試運行,除了不能運行在目錄中的調試器的可執行文件。儘管如此,調試仍然沒有太大的成功。

回答

14

可以使用命令線程信息線程找出當前線程數後斷點命中

(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線程號左邊表示當前線程。見here

14

我覺得自己做這一切的時候:

> t a a f 

簡稱:

> thread apply all frame 

當然,其他變體是可能的:

> t a a bt 3 

打印出底部3每個線程堆棧的幀。 (您也可以使用負數來獲得堆棧的前N幀)