【问题标题】:Breakpoint on the .init Section of a Shared Library共享库的 .init 部分上的断点
【发布时间】:2020-03-21 01:56:10
【问题描述】:

我试图在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 符号。有人知道原始地址案例中错误的原因吗?

【问题讨论】:

  • 获取地址0x7ffff6ebd9d0后是否重新运行程序?
  • 是的。但正如雇佣的俄罗斯人所说,首先应该映射地址。

标签: debugging gdb breakpoints elf inkscape


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2016-11-26
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多