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