是否可以在当前 gdb 会话期间加载额外的助手 .so?

  • 本文关键字:加载 so 会话 gdb 是否 c++ gdb
  • 更新时间 :
  • 英文 :


是否可以在当前 gdb 会话期间加载额外的助手 .so?

// point.h
class Point
{
public:
int x;
int y;
Point(int x1, int y1) {x = x1; y = y1;}
};
// main.cpp
#include "point.h"
#include <stdio.h>
int main()
{
Point p(3, 4);
printf("%dn", p.x);
return 0;
}

g++ -g -c main.cpp -o main.o g++ -g main.o -o main

调试时,我需要添加一个帮助程序函数来转储 Point 对象。但我不想重新编译和重新运行。(这可能需要很长时间。所以我正在尝试建立另一个 helper.so。

// helper.cpp
#include "point.h"
#include <stdio.h>
void dump_point(Point *p)
{
printf("Point(%d, %d)n", p->x, p->y);
}

g++ -g -fPIC -shared helper.cpp -o helper.so

是否可以在 gdb 中加载此 helper.so,以便我可以在不重新运行的情况下调用 dump_point()?

调试时,我需要添加一个帮助函数来转储 Point 对象。

"正常"的方法是在Python中编写自定义漂亮的打印机。

这样做的一个优点是漂亮的打印机也可以用于core转储,而dump_point()解决方案则不会(无论它是链接还是从单独的.so加载)。

所以我正在尝试建立另一个 helper.so。

如果您的mainlibdl相关联,则可以执行以下操作:

(gdb) call dlopen("./helper.so", 0)
(gdb) call dlsym($_, "dump_point")

注意:您需要进行dump_pointextern "C"以避免名称重整。

最新更新