假设有这样的事情:
#include <map>
int main(){
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够从gdb检查运行该程序的地图的内容.
如果我尝试使用下标运算符,我得到:
(gdb) p m[1]
Attempt to take address of value not located in memory.
Run Code Online (Sandbox Code Playgroud)
使用find方法不会产生更好的结果:
(gdb) p m.find(1)
Cannot evaluate function -- may be inlined
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
我按照GDB维基上的说明安装了用于查看STL容器的python pretty-printers.我~/.gdbinit现在看起来像这样:
python
import sys
sys.path.insert(0, '/opt/gdb_prettyprint/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
Run Code Online (Sandbox Code Playgroud)
但是,当我运行GDB并尝试打印STL类型时,我得到以下内容:
print myString
Python Exception <class 'gdb.error'> No type named std::basic_string<char>::_Rep.:
$3 =
Run Code Online (Sandbox Code Playgroud)
任何人都可以对此有所了解吗?我正在运行Ubuntu 12.04,它带有GDB 7.4.
我写了一个与此类似的函数:
class abc {
private :
int m_var ;
public :
int func() { return m_var ; }
};
Run Code Online (Sandbox Code Playgroud)
当我尝试打印func()使用abc对象指针时gdb,它给出错误:
**Cannot evaluate function -- may be inlined**
如何从内联函数中打印值?
#include <iostream>
void do_something(void) {
std::cout << "blah blah" << std::endl;
auto lambda_func = [](void){
std::cout << "in lambda" << std::endl;
return;
};
lambda_func();
std::cout << "..." << std::endl;
return;
}
int main(int argc, char **argv) {
do_something();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个示例程序中,如果你编译(g++ gdb-call-lambda.cpp --std=c++11 -g)然后在gdb(gdb ./a.out)中运行它,你可以让GDB调用任何"普通"函数.例:
(gdb) break main
Breakpoint 1 at 0x4008e7: file gdb-call-lambda.cpp, line 20.
(gdb) r
Starting program: /home/keithb/dev/mytest/gdb-call-lambda/a.out
Breakpoint 1, main (argc=1, argv=0x7fffffffdfb8) at gdb-call-lambda.cpp:20
20 do_something();
(gdb) call do_something()
blah blah …Run Code Online (Sandbox Code Playgroud) 我们都知道内联函数可以使调试变得更加棘手,因为它们可以从堆栈跟踪等中省略.但是假设我想从gdb中调用内联函数,并且我知道它的名称及其参数.我想我应该能够做到这一点,但我得到了这个:
Cannot evaluate function -- may be inlined
Run Code Online (Sandbox Code Playgroud)
我曾经nm在我正在使用的共享库中列出符号,并发现我想调用的函数不在那里.没什么大惊喜.我想要的是一种生成这些内联函数的可见定义的方法.我可以访问当前包含内联定义的头文件,但我无法真正修改这些头文件.也许有一些方法可以告诉编译器发出它在翻译单元中看到的所有内联函数的定义?或者其他一些技巧可以让你更容易调用和检查gdb中的内联函数的结果?
我在Linux上使用GCC 4.7.2和GDB 7.5.1.而且我无法真正切换到非优化版本,因为我正在从生产中调试核心转储(在开发中我只是关闭优化,然后事情变得更容易).
我正在研究一种使用大地图的算法。我正在尝试按照算法和 GDB 进行操作,同时在纸上进行操作以查看哪里出错了。但是随着地图变大,GDB 将其缩写并停止显示我需要的下一个值:
(gdb) p R
$1 = std::map with 140 elements = {[0] = "", [1] = "e", [2] = "", [3] = "", [4] = "", [5] = "", [6] = "", [7] = "", [8] = "a", [9] = "a", [10] = "", [11] = "", [12] = "", [13] = "", [14] = "",
[15] = "", [16] = "a", [17] = "b", [18] = "", [19] = "", [20] = "", [21] = "", …Run Code Online (Sandbox Code Playgroud)