1

目前 GDB 仅在回溯中打印微不足道的参数(仅标量);像下面的东西

(gdb) bt 1
(gdb) function1(this=this@entry=0xfff6c20, x1=-1, x2=3, x3=...

等等。这里的 x3 可能是一个数组/STL 向量,默认情况下 GDB 不显示它。

我在我的代码中使用了很多 STL 向量和 Blitz 数组。

我在 .gdbinit 文件中有例程来显示 STL 向量,在 C++ 中有子例程,我可以在其中利用 GDB 中的调用功能,它可以显示数组内容。要手动打印向量/数组内容,我会使用

(gdb) printVector vector_name -> this is a routine in my .gdbinit
(gdb) call printBlitzArray(array_name) -> this is a routine inside my executable itself.

我们如何让 GDB 显示如下函数的重要参数。

void myFunc(int x1, int x2, std::vector<int> x3, blitz::Array<bool, 1> x4)

我知道使用set print frame-arguments all 可以显示一些重要的参数。但是如何真正打印 GDB 可能不支持打印的参数。目的是在函数开始时自动打印所有参数(至少我们可以)。

我可以编写一个 GDB 脚本并为每个向量/数组单独添加打印,但是为每个函数执行此操作将非常耗时,因为我有大量函数。这将有助于加速我的调试。

任何建议都受到高度赞赏。

非常感谢提前!

4

1 回答 1

-1

我刚刚在自己的机器上测试过,-rdynamic编译时使用。 -rdynamicflag 基本上将所有符号(不仅仅是动态符号或外部依赖)复制到可执行文件的动态符号表中,从而允许它们在程序运行时加载到您的内存中,而不仅仅是由链接器使用作为一些元数据,这提供了任何回溯机制,完全名称损坏的符号并允许将其解析为您的原始函数(没有函数参数的实际名称,只是类型),希望这会有所帮助!:)

于 2020-05-11T11:38:24.623 回答