2011-09-29 105 views
1

我有一個C程序,其中主函數創建線程,我必須調試一個線程。我正在使用gdb。但是我不能在這個程序的特定C文件上「破解」或「監視」變量。例如。我的線程6被編程並使用某些C文件,並且我必須在601行上說call_connect.c。這不可能嗎?如果我嘗試,這是發生了什麼:GDB與pthreads

(gdb) info threads 
    6 Thread 0xb5c96b70 (LWP 3608) 0xb7fe1424 in __kernel_vsyscall() 
    5 Thread 0xb6497b70 (LWP 3607) 0xb7fe1424 in __kernel_vsyscall() 
    4 Thread 0xb6c98b70 (LWP 3606) 0xb7fe1424 in __kernel_vsyscall() 
    3 Thread 0xb7499b70 (LWP 3605) 0xb7fe1424 in __kernel_vsyscall() 
    2 Thread 0xb7c9ab70 (LWP 3604) 0xb7fe1424 in __kernel_vsyscall() 
* 1 Thread 0xb7c9b6c0 (LWP 3603) 0x0804a178 in main() 

(gdb) break 601 thread 6 
No line 601 in file "events.c". 

(gdb) break call_connect.c:601 thread 6 
No source file named call_connect.c. 

而且我調試我的C代碼-O0 -ggdb和我仍然無法觀察變量。 這是我在閱讀char * ptext變量時得到的結果。

(gdb) print ptext 
No symbol "ptext" in current context. 
(gdb) watch ptext 
No symbol "ptext" in current context. 

有人可以幫忙嗎?

回答

3

雖然我還沒有廣泛使用gdbpthreads但我有幾個你可能會嘗試的指針。

  1. 您可以切換到你想要使用thread threadnum其中threadnum是id(第一列)通過info threads顯示調試線程。

  2. 檢查正在查找的文件usinf show directories命令的源目錄。如果您的源所在的目錄不在列表中,通過directory <path_to_source>命令

  3. 添加它雖然設置斷點或手錶的自動完成(通常<Tab>)尋找斷點和手錶,你可以設置。

請檢查下線程調試中YoLinux pthreads Tutorials部分獲取更多詳細信息的鏈接。

希望這會有所幫助!

0

你的問題是你的程序編譯時沒有調試信息。

最可能的原因:要麼call_connect.c未經-ggdb標誌,儘管你已經聲稱什麼編譯(檢查您的構建日誌以驗證),或者你有你的鏈接線「流浪」 -s(這將剝離可執行文件) 。

+0

當然,'gdb'會告訴你,一旦你裝載了二進制文件,它是否找不到調試符號......?這不是一種快速驗證二進制文件是否包含調試符號的方法嗎? –

+1

GDB * *會正確地告訴你。你覺得'沒有名爲call_connect.c'的源文件是什麼意思? –