ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

GDB调试c++程序

2021-01-01 11:59:55  阅读:239  来源: 互联网

标签:lee GDB c++ Test gdb cpp main 断点 调试


示例文件main.cpp:

#include <iostream>
using namespace std;

int main(int argc,char *argv[])
{
        cout << "hello gdb" << endl;
        return 0;
}

目录结构:code

lee@lee-PC:~/code$ tree
.
├── bin
├── lib
└── src
    └── gdb
        └── mian.cpp
4 directories, 1 file

vim下直接在编辑界面+编译::! gcc mian.cpp -o main

using namespace std;
void Test()
{
        cout << "test function" << endl;;
}
int main(int argc,char *argv[])
{
        cout << "hello gdb" << endl;
        Test();
        cout << "gdb end" << endl;
        return 0;
}
~                                                                                                             
:!g++ main.cpp -o main 

GDB常用指令;
bt 查看函数调用的占空间信息,当程序down掉后,可以同步哦bt命令查看程序是从哪里down掉的。
lbirpnsc

命令格式作用
list<行号>|<函数名>查看指定位置的程序源代码
break<行号>|<函数名> |<条件表达式>设置断点
delete <断点号> |<断点范围>断点的删除
lear删除所在行的过个断点
info break显示断点信息
run运行程序
print <表达式>|<变量>查看程序运行时对应表达式和变量的值
next单步恢复程序运行,但不进入函数调用
step单步恢复程序运行,且进入函数调用
continue继续执行函数,知道函数结束或者遇到新的断点

指令:list

lee@lee-PC:~/code/src/gdb$ g++ main.cpp -o main
lee@lee-PC:~/code/src/gdb$ ls
main  main.cpp
lee@lee-PC:~/code/src/gdb$ ./main 
hello gdb
test function
gdb end
lee@lee-PC:~/code/src/gdb$ gdb main
GNU gdb (Debian 8.2.1-2+b1) 8.2.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main...(no debugging symbols found)...done.
(gdb) l
No symbol table is loaded.  Use the "file" command.
(gdb) 

执行一下指令

g++ main.cpp -o main ->
gdb main ->
l

以上list(l)没有符号表被载入,是什么原因?
因为编译的时候需要指定Debug 还是Release,是否需要把调试信息编译进去,g++默认的时候调试信息不会被编译进去
-g会把代码编译进去,把代码与二进制之间的关系编译进去,这样二进制指令执行到哪一行,同时也知道执行的代码到哪一行

g++ main.cpp -o main -g ->
gdb main ->
l

以上操作,l指令的时候才会显示出代码,一直l就会显示完所有的代码:

lee@lee-PC:~/code/src/gdb$ g++ main.cpp -o main -g
lee@lee-PC:~/code/src/gdb$ gdb main 
GNU gdb (Debian 8.2.1-2+b1) 8.2.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

--Type <RET> for more, q to quit, c to continue without paging--
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main...done.
(gdb) l
1       #include <iostream>                                                                                   
2       using namespace std;                                                                                  
3       void Test()                                                                                           
4       {                                                                                                     
5               cout << "test function" << endl;;                                                             
6       }                                                                                                     
7       int main(int argc,char *argv[])                                                                       
8       {                                                                                                     
9               cout << "hello gdb" << endl;                                                                  
10              Test();                                                                                       
(gdb)  

list后面跟函数名:

(gdb) list Test                                                                                               
1       #include <iostream>                                                                                   
2       using namespace std;                                                                                  
3       void Test()                                                                                           
4       {                                                                                                     
5               cout << "test function" << endl;;                                                             
6       }                                                                                                     
7       int main(int argc,char *argv[])                                                                       
8       {                                                                                                     
9               cout << "hello gdb" << endl;                                                                  
10              Test();                                                                                       
(gdb)  

list后面跟行号:

(gdb) list 3                                                                                                  
1       #include <iostream>                                                                                   
2       using namespace std;                                                                                  
3       void Test()                                                                                           
4       {                                                                                                     
5               cout << "test function" << endl;;
6       }
7       int main(int argc,char *argv[])
8       {
9               cout << "hello gdb" << endl;
10              Test();
(gdb) 

指令:break,设置断点

  • 接行号
(gdb) break 5
Breakpoint 1 at 0x401176: file main.cpp, line 5.
(gdb) break 10
Breakpoint 2 at 0x4011c0: file main.cpp, line 10.
(gdb) break 11
Breakpoint 3 at 0x4011c5: file main.cpp, line 11.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000401176 in Test() at main.cpp:5
2       breakpoint     keep y   0x00000000004011c0 in main(int, char**) at main.cpp:10
3       breakpoint     keep y   0x00000000004011c5 in main(int, char**) at main.cpp:11
  • 接函数名(函数的入口设置断点)
(gdb) break Test
Note: breakpoint 1 also set at pc 0x401176.
Breakpoint 4 at 0x401176: file main.cpp, line 5.
(gdb) info break
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000401176 in Test() at main.cpp:5
2       breakpoint     keep y   0x00000000004011c0 in main(int, char**) at main.cpp:10
3       breakpoint     keep y   0x00000000004011c5 in main(int, char**) at main.cpp:11
4       breakpoint     keep y   0x0000000000401176 in Test() at main.cpp:5

删除一号断点:

(gdb) delete 5
No breakpoint number 5.
(gdb) delete 1
(gdb) info break
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   0x00000000004011c0 in main(int, char**) at main.cpp:10
3       breakpoint     keep y   0x00000000004011c5 in main(int, char**) at main.cpp:11
4       breakpoint     keep y   0x0000000000401176 in Test() at main.cpp:5

程序运行:run,到第一个断点处停止,此处位函数入口的断点,可以跳过(next),可以进入(step)

(gdb) run
Starting program: /home/lee/code/src/gdb/main 
hello gdb

Breakpoint 2, main (argc=1, argv=0x7fffffffcc18) at main.cpp:10
10              Test();
(gdb) 

next: 执行下一行代码,但是不进入函数

(gdb) next

Breakpoint 4, Test () at main.cpp:5
5               cout << "test function" << endl;;
(gdb) d 4
(gdb) step
test function
6       }
(gdb) 

从结果中看出,在到达函数调用处的代码时,如果函数中设置断点,next的时候会直接进入到函数代码;如果删除断点,step才会进入到函数否则,使用next就是直接执行完此处函数(当成一行代码)

  • continue:从一个断点到下一个断点
Breakpoint 2, main (argc=1, argv=0x7fffffffcc18) at main.cpp:10
10              Test();
(gdb) continue
Continuing.
test function

Breakpoint 3, main (argc=1, argv=0x7fffffffcc18) at main.cpp:11
11              cout << "gdb end" << endl;
(gdb) 

  • 接条件表达式

//-----------------------------------------------------------------------
其他知识点:window共享出来的目录是 nobody nogroup
chmod 777 * -R,当前目录下所有文件及其子文件的权限设置

标签:lee,GDB,c++,Test,gdb,cpp,main,断点,调试
来源: https://blog.csdn.net/chengfenglee/article/details/112058608

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有