102

假设有这样的东西:

#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

有没有办法做到这一点?

4

7 回答 7

107

这个问题的现有答案非常过时。由于GDB 7.x 中内置的 Python 支持和 GCC 附带的 libstdc++ 漂亮的打印机,它使用最近的 GCC 和 GDB,它只是 Works TM 。

对于 OP 的示例,我得到:

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

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

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

于 2013-03-11T00:26:00.840 回答
36

我认为没有,至少在您的源代码经过优化等情况下没有。但是,gdb 有一些宏可以为您检查 STL 容器:

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

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

于 2009-01-09T10:31:00.790 回答
25

总是有明显的:定义你自己的测试函数......从 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) 
于 2009-01-10T00:10:33.840 回答
21

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
于 2009-01-11T22:52:36.307 回答
12

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

于 2009-01-09T11:57:57.283 回答
0

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

(gdb) pmap myMap char int

pmap <variable_name> <left_element_type> <right_element_type>查看地图中的元素。

希望有帮助。

于 2019-01-08T07:05:31.223 回答
-1

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

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

于 2013-02-03T21:37:21.427 回答