我尝试在inkscape-0.92.3
中运行gdb
。确切地说,我尝试在其主要共享库(即.init
)的/usr/lib/inkscape/libinkscape_base.so
节的第一个地址上设置一个断点。根据{{1}}返回的信息,地址为0x7ffff6ebd9d0
。但是,当我使用info files
在此地址上设置断点时,会出现以下错误:
b *0x7ffff6ebd9d0
此地址是此库的Cannot insert breakpoint 1.
Cannot access memory at address 0x7ffff6ebd9d0
函数的地址。其他共享库中也存在相同的符号。因此,我可以使用_init
在此符号上设置一个断点,这会导致很多子断点。这次,所有断点都可以正常工作,我可以b _init
到c(ontinue)
共享库的_init
符号为止。有人知道原始地址错误的原因吗?
答案 0 :(得分:1)
有人知道原始地址错误的原因吗?
原因:此地址尚未映射(库尚未加载)。
它适用于break _init
情况,因为GDB可以检查是否有任何新加载的共享库定义了该符号。但是检查地址0x7ffff6ebd9d0
是否可断点还不够聪明。
您可以使用(gdb) set stop-on-solib-events 1
解决此问题。然后,每次运行新的共享库时,GDB将在运行它们的初始化程序之前停止运行。
出现libinkscape_base.so
后,您将可以根据需要使用地址断点。