2012-11-06 28 views
1

我有一個源文件shared_lib_test.c其中有象下面這樣一些代碼:如何在共享庫中的確切行號上設置斷點?

10 void test_function(void) 
11 { 
12 do_me(); 
13 skip_me(); 
14 return; 
15 } 

我想使用gdb跳過13行,我應該怎麼辦呢?這個函數屬於共享庫而不是二進制文件。

如果這個函數屬於二進制的話,我可以使用下面的命令來做到這一點:

b shared_lib_test.c:13 
commands 1 
jump 14 
continue 
end 

但由於它屬於共享庫,我不能設置的確切行號一個破發點源文件,我嘗試'b test_function +2',但它似乎是非法的gdb。

+0

嘗試在共享庫上使用b fileName.cpp:lineNumber而不是使用函數名稱。它必須打破。然後你可以使用通常的指令集。爲什麼你要在功能上設置斷點以防共享庫? –

+0

感謝您的評論,我這樣做的原因是我想節省時間更改共享庫內的邏輯而不編譯它。 – user1726366

回答

1

進行調試共享庫,則需要使用

set breakpoint pending - 設置調試器的關於懸而未決的斷點的行爲。

在共享庫中有一個斷點是很常見的。共享庫可以在程序執行時顯式地加載和卸載,並且可能重複地加載和卸載。爲了支持這種用例,每當任何共享庫被加載或卸載時,gdb都會更新斷點位置。通常,您可以在調試會話開始時的共享庫中設置斷點,未裝入庫時以及庫中的符號不​​可用。當您嘗試設置斷點時,gdb會詢問您是否要設置地址尚未解析的所謂掛起斷點斷點。

GDB提供了一些額外的命令來控制,當'破解」命令不能解析斷點地址規格地址會發生什麼:

set breakpoint pending auto 這是默認的行爲。當gdb找不到斷點位置時,它會詢問您是否應該創建掛起的斷點。

set breakpoint pending on 這表明一個無法識別的斷點位置應該自動導致創建未決斷點。

set breakpoint pending off 這表明掛起斷點不被創建。任何無法識別的斷點位置都會導致錯誤。此設置不會影響以前創建的任何掛起的斷點。

show breakpoint pending 顯示創建掛起斷點的當前行爲設置。

來到你的問題。即跳過一行

使用jump +1當您的代碼達到該共享庫行(skip_me())之前。

參考

http://wiki.documentfoundation.org/Development/How_to_debug

gdb: how to set breakpoints on future shared libraries with a --command flag

http://bhushanverma.blogspot.in/2009/08/how-to-debug-shared-library-using-gdb.html

http://www.toptip.ca/2010/06/gdb-skip-instructions-or-lines-while.html

Can I use gdb to skip a line?

+0

非常感謝你的親切幫助,我一整天都陷在這裏,你救了我的命。 :) – user1726366