共享库的 .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
出现,您就可以根据需要使用地址断点了。
我试图在 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
出现,您就可以根据需要使用地址断点了。