问题描述
假设我们有下面的m.cpp文件
- #include <iostream>
- using namespace std;
- int main(int argc, char * argv[]) {
- cout << "hello" << endl;
- return 0;
- }
用下面的方式build,得到binary文件t
- g++ -g m.cpp -o t
然后用gdb调试,想调试到m.cpp的第5行
gdb ./t
如果用 b m.cpp 5 的方式设断点,结果如下
- (gdb) b m.cpp 5
- Can't find member of namespace, class, struct, or union named "m.cpp"
- Hint: try 'm.cpp 5<TAB> or 'm.cpp 5<ESC-?>
- (Note leading single quote.)
- Make breakpoint pending on future shared library load? (y or [n]) y
- Breakpoint 1 (m.cpp 5) pending.
- (gdb) i b
- Num Type Disp Enb Address What
- 1 breakpoint keep y <PENDING> m.cpp 5
可见,这样的断点不能被gdb正确识别,用 i b,即 info breakpoints 打印出的断点的 Adress 是空!执行 run,会发现gdb 不会停在m.cpp 第5行!
正确的做法如下
- (gdb) b m.cpp :5
- Breakpoint 1 at 0x400823: file m.cpp, line 5.
- (gdb) i b
- Num Type Disp Enb Address What
- 1 breakpoint keep y 0x0000000000400823 in main(int, char**) at m.cpp:5
可见,根本就没有出现 “ Make breakpoint pending on future shared library load? (y or [n]) ” 这样的提示,并且 i b 打印出了断点的 Adress !
小结
不要这样设断点:b m.cpp 5
而要这样:b m.cpp:5