共享库的.init节的断点

时间:2019-11-25 17:51:42

标签: debugging gdb breakpoints elf inkscape

我尝试在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 _initc(ontinue)共享库的_init符号为止。有人知道原始地址错误的原因吗?

1 个答案:

答案 0 :(得分:1)

  

有人知道原始地址错误的原因吗?

原因:此地址尚未映射(库尚未加载)。

它适用于break _init情况,因为GDB可以检查是否有任何新加载的共享库定义了该符号。但是检查地址0x7ffff6ebd9d0是否可断点还不够聪明。

您可以使用(gdb) set stop-on-solib-events 1解决此问题。然后,每次运行新的共享库时,GDB将在运行它们的初始化程序之前停止运行。

出现libinkscape_base.so后,您将可以根据需要使用地址断点。