使用 gdb 检查标准容器 (std::map) 内容

发布于 2024-07-11 16:49:36 字数 440 浏览 4 评论 0原文

假设有这样的事情:

#include <map>
int main(){
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;
}

我希望能够检查从 gdb 运行程序的地图的内容。
如果我尝试使用下标运算符,我会得到:

(gdb) p m[1]
Attempt to take address of value not located in memory.

使用 find 方法不会产生更好的结果:

(gdb) p m.find(1)
Cannot evaluate function -- may be inlined

有没有办法实现此目的?

Supposing to have something like this:

#include <map>
int main(){
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;
}

I would like to be able to inspect the contents of the map running the program from gdb.
If I try using the subscript operator I get:

(gdb) p m[1]
Attempt to take address of value not located in memory.

Using the find method does not yield better results:

(gdb) p m.find(1)
Cannot evaluate function -- may be inlined

Is there a way to accomplish this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

狼性发作 2024-07-18 16:49:36

这个问题的现有答案非常已经过时了。 借助最新的 GCC 和 GDB,它可以正常工作TM,这要归功于 GDB 7.x 中内置的 Python 支持以及 GCC 附带的 libstdc++ 漂亮打印机。

对于OP的示例,我得到:

(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}

如果它不能自动工作,请参阅 STL 支持上的第一个要点GDB wiki 的 页面。

您也可以为自己的类型编写Python漂亮的打印机,请参阅 GDB 手册中的漂亮打印

The existing answers to this question are very out of date. With a recent GCC and GDB it Just WorksTM thanks to the built-in Python support in GDB 7.x and the libstdc++ pretty printers that come with GCC.

For the OP's example I get:

(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}

If it doesn't work automatically for you see the first bullet point on the STL Support page of the GDB wiki.

You can write Python pretty printers for your own types too, see Pretty Printing in the GDB manual.

妄司 2024-07-18 16:49:36

我认为没有,至少如果你的源代码经过优化的话就没有。但是,gdb 有一些宏可以为你检查 STL 容器:

http://sourceware.org/ml/gdb/2008-02/msg00064.html

但是,我不使用这个,所以 YMMV

I think there isn't, at least not if your source is optimized etc. However, there are some macros for gdb that can inspect STL containers for you:

http://sourceware.org/ml/gdb/2008-02/msg00064.html

However, I don't use this, so YMMV

墨小墨 2024-07-18 16:49:36

总是有显而易见的事情:定义您自己的测试函数...从 gdb 调用它。 例如:

#define SHOW(X) cout << # X " = " << (X) << endl

void testPrint( map<int,int> & m, int i )
{
  SHOW( m[i] );
  SHOW( m.find(i)->first );
}

int
main()
{
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;  // Line 15.
}

和:

....
Breakpoint 1 at 0x400e08: file foo.C, line 15.
(gdb) run
Starting program: /tmp/z/qD 

Breakpoint 1, main () at qD.C:15
(gdb) call testPrint( m, 2)
m[i] = 4
(*m.find(i)).first = 2
(gdb) 

There's always the obvious: Define your own test-function... Call it from gdb. E.g.:

#define SHOW(X) cout << # X " = " << (X) << endl

void testPrint( map<int,int> & m, int i )
{
  SHOW( m[i] );
  SHOW( m.find(i)->first );
}

int
main()
{
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;  // Line 15.
}

And:

....
Breakpoint 1 at 0x400e08: file foo.C, line 15.
(gdb) run
Starting program: /tmp/z/qD 

Breakpoint 1, main () at qD.C:15
(gdb) call testPrint( m, 2)
m[i] = 4
(*m.find(i)).first = 2
(gdb) 
无法回应 2024-07-18 16:49:36

stl-views.gdb 曾经是最好的答案,但现在不再了。

这还没有集成到主线 GDB 中,但这是使用“archer-tromey-python”分支

(gdb) list
1   #include <map>
2   int main(){
3       std::map<int,int> m;
4       m[1] = 2;
5       m[2] = 4;
6       return 0;
7   }
(gdb) break 6
Breakpoint 1 at 0x8048274: file map.cc, line 6.
(gdb) run

Breakpoint 1, main () at map.cc:6
6       return 0;
(gdb) print m
$1 = std::map with 2 elements = {
  [1] = 2,
  [2] = 4
}
(gdb) quit

The stl-views.gdb used to be the best answer there was, but not anymore.

This isn't integrated into the mainline GDB yet, but here is what you get using the 'archer-tromey-python' branch:

(gdb) list
1   #include <map>
2   int main(){
3       std::map<int,int> m;
4       m[1] = 2;
5       m[2] = 4;
6       return 0;
7   }
(gdb) break 6
Breakpoint 1 at 0x8048274: file map.cc, line 6.
(gdb) run

Breakpoint 1, main () at map.cc:6
6       return 0;
(gdb) print m
$1 = std::map with 2 elements = {
  [1] = 2,
  [2] = 4
}
(gdb) quit
素染倾城色 2024-07-18 16:49:36

尝试取消引用 STL 容器:在此页面上: http://www.yolinux.com/教程/GDB-Commands.html

Try De-Referencing STL Containers: on this page: http://www.yolinux.com/TUTORIALS/GDB-Commands.html

べ繥欢鉨o。 2024-07-18 16:49:36

上面的答案是有效的并且很好。 如果您使用 stl-views.gdb,以下是查看其中的地图和元素的正确方法。
让你的地图如下:
std::map; myMap;

(gdb) pmap myMap char int

pmap; <左元素类型> 查看地图中的元素。

希望有帮助。

The answers above are working and fine. In case you are using stl-views.gdb, here is the proper way of viewing the maps and elements inside it.
Let your map is as follows :
std::map<char, int> myMap;

(gdb) pmap myMap char int

i.e. pmap <variable_name> <left_element_type> <right_element_type> to see the elements in the map.

Hope that helps.

金兰素衣 2024-07-18 16:49:36

您可以通过确保编译器在编译程序时使用 DWARF-2(或 3 或 4)调试信息来解决第二个问题(无法计算函数 - 可能是内联的)。 DWARF-2 包含内联信息,因此您应该能够使用您描述的任一方法来访问 std::map 容器的元素。

要使用 DWARF-2 调试信息进行编译,请将 -gdwarf-2 标志添加到编译命令中。

You can get around the second problem (Cannot evaluate function -- may be inlined) by making sure that your compiler uses DWARF-2 (or 3 or 4) debugging information when you compile your program. DWARF-2 includes inlining information, so you should be able to use either of the methods you described to access elements of your std::map container.

To compile with DWARF-2 debug info, add the -gdwarf-2 flag to your compile command.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文