【问题标题】:gdb how to set breakpoint in dynamic library opened by dlopengdb如何在dlopen打开的动态库中设置断点
【发布时间】:2014-04-04 09:55:22
【问题描述】:

下午,各位。 我有一个由 main.c 编译的应用程序“测试”。一个动态库“libtest.so”,由 test.cpp 用“-g”编译。在 main.c 中,我使用 'dlopen' 调用 'libtest.so' 。现在我想在 test.cpp 中设置一个断点,但是 gdb 从来没有命中它。我这样做:

gdb ./test -d /home/lcl/test

破解 test.cpp:35

运行

谁能给我一些建议,谢谢!

【问题讨论】:

  • 感谢回复我,-d 只是指向 gdb 搜索的目录。就像 dir 命令一样
  • 我试过了。第 35 行只是一个函数名。如果我使用 'gcc -c main.c -o test -ltest -L./' 编译 test.c,我可以设置断点,但使用 dlopen 打开时失败 ...
  • 是的,但现在我必须吃晚饭了。我稍后会附上代码。并感谢 Mantosh Kumar
  • 是的,有了这个小小的进步,你就有资格吃晚饭了。 :)
  • 两年后我也遇到了同样的问题,你是怎么解决的?

标签: c++ c gdb dlopen


【解决方案1】:

您应该首先验证dlopen 确实成功(很可能不是)。

这样做:

  • main.c 中设置断点之后 dlopen
  • 确认返回的句柄不是NULL

此时,GDB 应该已经为libtest.so 加载了符号,并且libtest.so 应该出现在info shared GDB 输出中。

如果一切正常,info break 应该在test.cpp:35 的某个地址处显示一个活动断点。如果从未命中该断点,则很可能您从未真正执行过该行代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2014-03-29
    • 2014-09-22
    • 2016-11-26
    • 1970-01-01
    • 2014-11-23
    相关资源
    最近更新 更多