我試圖調試第三方共享庫中的函數。我很難在函數中設置一個斷點,因爲應用程序在加載庫後不久就死掉了。有誰知道在mdb中設置掛起斷點的方法,因此斷點在加載庫後立即設置?是否有可能設置一個掛起的斷點在Solaris模塊調試器(MDB)
穆斯塔法
我試圖調試第三方共享庫中的函數。我很難在函數中設置一個斷點,因爲應用程序在加載庫後不久就死掉了。有誰知道在mdb中設置掛起斷點的方法,因此斷點在加載庫後立即設置?是否有可能設置一個掛起的斷點在Solaris模塊調試器(MDB)
穆斯塔法
你叫什麼掛起的斷點被稱爲在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
享受調試!
我不能完全弄清楚如何做設置掛起的斷點,但我發現,越來越最後加載的庫的名稱,幫助。爲此,我在'open'系統調用中添加了一個系統斷點,並向斷點打印了第一個參數(即文件名)並繼續。
> ::sysbp -c "<i0 /s; ::cont" open
> ::cont
謝謝你!您幫助節省了無數小時的浪費的調試時間。 – 2012-02-13 20:30:16