共享库的 .init 部分上的断点

Breakpoint on the .init Section of a Shared Library

我试图在 gdb 中 运行 inkscape-0.92.3。准确地说,我试图在其主共享库中.init 部分的第一个地址(即/usr/lib/inkscape/libinkscape_base.so)设置断点。根据info files返回的信息,地址为0x7ffff6ebd9d0。但是当我使用 b *0x7ffff6ebd9d0 在此地址上设置断点时,我收到以下错误:

Cannot insert breakpoint 1.
Cannot access memory at address 0x7ffff6ebd9d0

这个地址就是这个库的_init函数的地址。相同的符号也存在于其他共享库中。所以我可以使用 b _init 在这个符号上放置一个断点,这会导致很多子断点。这次所有断点都工作正常,我可以 c(ontinue) 直到到达 libinkscape 共享库的 _init 符号。有人知道原始地址情况下错误的原因吗?

Does anybody know the reason for the error in the raw address case?

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

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

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

一旦libinkscape_base.so出现,您就可以根据需要使用地址断点了。