2012-02-07 16 views

回答

3

你叫什麼掛起的斷點被稱爲mdb推遲斷點;它使用的方式是這樣的:

$ mdb /bin/ls 
> ::bp libc.so.1`_init 
> :r 
mdb: stop at libc.so.1`_init 
mdb: target stopped at: 
libc.so.1`_init:save  %sp, -0x60, %sp 

I.e.只是把::bp命令各處,<addr>::bp是直接的(和需要符號/地址爲目前,已加載),而::bp <object`symbol>被延遲(和調試器激活首次加載指定的對象時)。使用object`symbol符號,你可以在甚至不同的庫相同名字的功能區分:

 
> !ldd /bin/ls 
     libsec.so.1 => /lib/libsec.so.1 
     libc.so.1 =>  /lib/libc.so.1 
     libavl.so.1 => /lib/libavl.so.1 
     libm.so.2 =>  /lib/libm.so.2 
> ::bp libsec.so.1`_init 
> ::bp libc.so.1`_init 
> ::bp libavl.so.1`_init 
> ::bp libm.so.2`_init 
> ::bp _init 
> :r 
mdb: stop at libc.so.1`_init 
mdb: target stopped at: 
libc.so.1`_init:save  %sp, -0x60, %sp 
> :c 
mdb: stop at libavl.so.1`_init 
mdb: target stopped at: 
libavl.so.1`_init:  save  %sp, -0x60, %sp 
> :c 
mdb: stop at libsec.so.1`_init 
mdb: target stopped at: 
libsec.so.1`_init:  save  %sp, -0x60, %sp 
> :c 
mdb: stop at _init 
mdb: target stopped at: 
_init:   save  %sp, -0x60, %sp 

享受調試!

+0

謝謝你!您幫助節省了無數小時的浪費的調試時間。 – 2012-02-13 20:30:16

0

我不能完全弄清楚如何做設置掛起的斷點,但我發現,越來越最後加載的庫的名稱,幫助。爲此,我在'open'系統調用中添加了一個系統斷點,並向斷點打印了第一個參數(即文件名)並繼續。

> ::sysbp -c "<i0 /s; ::cont" open 
> ::cont 
相關問題