是否可以在solaris模块化调试器(mdb)中设置挂起断点

时间:2012-02-07 15:09:28

标签: debugging solaris

我正在尝试调试第三方共享库中的函数。我很难在函数中设置断点,因为应用程序在加载库后不久就会死掉。有没有人知道在mdb中设置挂起断点的方法,以便在加载库后不久设置断点?

的Mustafa

2 个答案:

答案 0 :(得分: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

即。只需转动::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

享受调试!

答案 1 :(得分:0)

我无法弄清楚如何设置挂起的断点但我发现获取最后一个库的名称已经帮助了。为此,我在'open'系统调用上添加了一个系统断点,并在断点处添加了一个命令,打印出第一个打开的参数(即文件名)并继续。

> ::sysbp -c "<i0 /s; ::cont" open
> ::cont