dbx 会自动检测发生了 dlopen() 还是 dlclose(),然后装入装入对象的符号表。使用 dlopen() 装入共享对象后,即可在其中设置断点,然后像对待程序的任何部分一样进行调试。
如果共享对象是使用 dlclose() 卸下的,dbx 会记住其中设置的断点,并在使用 dlopen() 再次装入该共享对象时替换这些断点,即便应用程序再次运行也是如此。
但如果要在其中设置断点,或导航其函数和源代码,就不必等待使用 dlopen() 装入共享对象。如果知道正被调试的程序将使用 dlopen() 装入的共享对象的名称,可以使用 loadobject -load 命令请求 dbx 预装其符号表:
loadobject -load /usr/java1.1/lib/libjava_g.so |
现在便可在此装入对象被 dlopen() 装入前在其中导航模块和函数及设置断点。装入对象由程序装入后,dbx 即会自动设置断点。
在动态链接库中设置断点受以下限制:
使用 dlopen() 装入的“过滤器”库中的第一个函数被调用后,才能在该库中设置断点。
dlopen() 装入库后,名为 _init() 的初始化例程便会被调用。此例程可能会调用库中的其他例程。在此初始化完成之前,dbx 不能在已装入的库中设置断点。确切地讲,这意味着无法让 dbx 在 dlopen() 装入的库中的 _init() 处停止。