一、C语言调试—— gdb 的使用
1.1 gdb 调试工具常用命令
- list:展开调试的源代码,缩写 l;
- break:设置断点,缩写为 b;
- info break:查看断点信息,缩写为 i b
- delete:删除断点
- print:打印变量的值,缩写为 p;
- run:程序开始运行,缩写 r,在 r 后可以加入程序启动启动参数,程序运行到断点处暂停;
- step:单步调试,可以进入子函数,缩写为 s;
- next:单步调试,不进入子函数,缩写为 n;
- continue:程序继续运行,,到下一断点处暂停,缩写为 c;
- set args:设置运行参数
- show args:查看运行参数
- gdb attatch pid:加载运行中的进程进行调式
- dir dirname ... :指定源目录
- x/28hx ---:以十六进程输出内存块数据
- kill:停止调试
- 段错误调试:
- 通过 ulimit 命令查看一下系统是否配置支持了 dump core 的功能。通过 ulimit -c 或 ulimit -a,可以查看 core file 大小的配置的情况,如果为 0,则表示系统关闭了 dump core;可以通过 ulimit -c unlimited 来打开。若发生了段错误,但没有 core dump,是由于系统禁止 core 文件的生成。
- gdb [exec file] [core file] | gdb -c corefile execfile
- backtrace:查看堆栈信息,缩写为 bt,注意 run 到出错的地方后,运行此命令,可以查看到错误的地方
- frame 堆栈错误编号:切换到编号处堆栈
- 之后用 gdb 的通用调试命令查看参数等
1.2 例子
swap.c
#include <stdio.h> void swap(int *a, int *b);
void swap_error(int a, int b); int main(void)
{
int i = ;
int j = ; printf("i: %d, j: %d\n", i, j);
swap(&i, &j);
printf("i: %d, j: %d\n", i, j); return ;
} void swap(int *a, int *b)
{
int c = *a;
*a = *b;
*b = c;
} void swap_error(int a, int b)
{
int c = a;
a = b;
b = c;
}
编译出目标文件(.o 文件): gcc -c -g -Wall swap.c
编译出可执行文件:gcc -g -o app swap.o
运行:gdb app
运行 list 命令可以列出源码:

list 后可以加函数名,列出函数,如 list main、list swap
设置断点, break main(或者使用 break swap.c:main(或行号)) 和列出断点信息 info break,也可以通过 b 行号 设置断点

运行程序,run(r) 命令:

运行到下一行,next(n)命令:

打印 i 的值,print(p) i:

打印 i 的地址,p &i:

进入子函数,step(s)命令:

打印 a:

a 的值与 i 的地址一样,即 a = &i
删除断点,delete 断点标号:

一、C语言调试—— gdb 的使用的更多相关文章
- GDAL库调试(包括跨语言调试)
很多时候都需要调试GDAL库,尤其是像学习GDAL库中的某些算法是如何实现的时候,调试就必不可少了. 首先说明用C++的调试.以VS2008为例进行说明. 编译DEBUG版本的GDAL库,这个可以参考 ...
- linux-c 调试 gdb
GDB(GNU Debugger) gcc -g –o testarg testarg.c //可执行文件中带上调试信息,用于后续的gdb调试 gdb testarg l; list //显示源程序 ...
- Linux下C语言的调试 - gdb
调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...
- c语言之gdb调试。
1.此文档演示如何使用gdb调试c语言代码. 代码如下: #include <stdio.h> /*函数声明*/ void digui(int n); int main() { ; dig ...
- C语言调试器GDB和LLDB的使用方法
调试器的使用 编译输出带调试信息的程序 调试信息包含:指令地址.对应源代码及行号 指令完成后,回调 LINUX使用GDB MAX使用LLDB 使用说明 // 开始调试testlib程序 lldb te ...
- c语言,gdb
Get gdb call stack http://blog.csdn.net/zoufeiyy/article/details/1490241 Debugging with GDB - Examin ...
- linux下的C语言开发 GDB的例子
在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正 ...
- C 调试 gdb常用命令
gdb常用命令: [root@redhat home]#gdb 调试文件:启动gdb (gdb) l :(字母l)从第一行开始列出源码 (gdb) break n :在第n行处设置断点 (gdb) b ...
- C语言调试过程中duplicate symbol错误分析
说明:在我们调试C语言的过程中,经常会遇到duplicate symbol错误(在Mac平台下利用Xcode集成开发环境).如下图: 一.简单分析一下C语言程序的开发步骤. 由上图我们可以看出C语言由 ...
随机推荐
- 如何将外部数据库 导入到系统的SQL中
打开数据库sql管理 在数据库中新建查询 如何输入: exec sp_attach_db @dbname='YourDataBaseName', @filename1='mdf文件路径', @fi ...
- ubuntu18.04修改网卡名称为eth0
1.修改grub文件 vim /etc/default/grub 查找 GRUB_CMDLINE_LINUX="" 修改为 GRUB_CMDLINE_LINUX="net ...
- Ubuntu 16.04 屏幕亮度无法调节怎么办
安装好ubuntu 16.04之后,发现屏幕超亮,找不到调节按钮,这应该是系统的一个漏洞, 不过可以安装工具来操作,从而解决亮度调节问题,下面是安装 Brightness Controller 的方 ...
- Linux(CentOS7)下远程拷贝文件,scp命令
一.Linux版本 二.scp命令 scp [参数] [原路径] [目标路径] scp -P 22022 /home/file.war root@192.168.253.172:/home/test ...
- MySQL 是如何解决幻读的
MySQL 是如何解决幻读的 一.什么是幻读 在一次事务里面,多次查询之后,结果集的个数不一致的情况叫做幻读. 而多出来或者少的哪一行被叫做 幻行 二.为什么要解决幻读 在高并发数据库系统中,需要保证 ...
- node的第一步,hello,以及小技巧和CPU使用情况。到底能用几个核心?
安装了啥的就不说了,百度一下有很多. Windows环境.Linux不会,所有就不说了. 1. hello Word node的hello Word很简单,就一行. console.log(&quo ...
- 分布式存储ceph——(2)openstack对接ceph存储后端
ceph对接openstack环境 一.使用rbd方式提供存储如下数据: (1)image:保存glanc中的image: (2)volume存储:保存cinder的volume:保存创建虚拟机时选择 ...
- MySQL数据库聚合函数
+++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库聚合函数时间:2019年2月25日内容:MySQL数据库聚合函数重点:MySQL数据库聚合函 ...
- vue省市区三级联动
仿照小米之家做的一个省市区三级联动,先上代码: HTML: <template> <section class="myAddress"> <secti ...
- [转帖]rsync简介
rsync用法详细解释 https://www.cnblogs.com/noxy/p/8986164.html 之前一直使用 scp 现在发现这个命令更好一些. 提要 熟悉 rsync 的功能及其特点 ...