gdb使用_转
在编程调试中,经常出现段错误,此时可用gdb调试。具体方法为注册段错误信号处理函数,在处理函数中启动gdb。
具体代码如下:
void segv_handler(int no)
{
char buf[512];
char cmd[512];
FILE *file;
snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid());
if(!(file = fopen(buf, "r")))
{
exit(EXIT_FAILURE);
}
if(!fgets(buf, sizeof(buf), file))
{
eixt(EXIT_FAILURE);
}
if(buf[strlen(buf) - 1 ] == '\n')
{
buf[strlen(buf) -1] = '\0';
}
snprintf(cmd, sizeof(cmd), "gdb %s %d", buf, getpid());
system(cmd);
}
注册函数:
signal(SIGSEGV, segv_handler);
下面转自一些总结:
作为一名程序猿,日常开发中解决各种bug是不可避免的。对于简单的bug通过日志分析,或者增加打印信息就能很快定位到原因并解决。但是对于某些比较复杂的情况,想要定位到bug往往十分困难。查阅了很多资料,经过不断尝试,我发现gdb调试能够起到很大的帮助。下面我将对使用gdb的一些常用技巧和实例做下总结。
下面总结下比较关键的几个用法:
一、启动GDB调试
使用gdb调试首先在编译程序时加上-g参数:$ gcc –g –o foo foo.c
启动gdb调试有多种方法,可以根据不同的场景选择合适的方式,这也是gdb比较好用的地方。
1. 程序没有运行时,gdb +<program> 直接用gdb运行程序;
2. 程序运行中的gdb调试有两种方式:
a.ps查看程序的PID,gdb + <program> + PID ,自动挂接到已运行的程序;
b.ps产看程序的PID,gdb + <program>运行gdb后,用attach + PID指令挂接到程序, 并用detach来取消挂接的进程。
3. 程序已经死掉后,gdb +<program> + core文件进行调试,core文件是程序非法执行后产生的“核心转储”文件。有些情况下core不能生成,需要用ulimit -c unlimited指令先设置系统环境。
二、针对第二种gdb启动方式,可以有如下实现方式。
程序发生段错误,但是该异常发生有一定的随机性,为了捕获异常并进行gdb调试,在程序中捕获SIGSEGV信号并进行如下处理,这样当程序运行出现段错误时直接进入gdb调试环境。
三、gdb调试常用指令
关于gdb调试的常用指令及介绍可以参考这里,http://blog.csdn.net/liwf616/article/details/46833107
Gdb环境下直接按下回车表示执行上一条命令
1. break 设置断点,
break10 设置断点,在源程序第10行
breakfunc 设置断点,在func函数入口处
infobreak 查看断点信息
2. run 运行程序,可简写为r
3. next 单步跟踪,函数调用当作一条简单语句执行,可简写为n
step 单步跟踪,函数调进入被调用函数体内,可简写为s
stepi 或si单步跟踪一条机器指令
nexti 或ni单步跟踪一条机器指令
4. continue 继续运行程序,可简写为c
5. print 打印变量、字符串、表达式等的值,可简写为p
p count 打印count的值
p cou1+cou2+cou3 打印表达式值
6. bt 查看函数堆栈
7. finish 退出函数
8. quit 退出GDB
9. shell 不退出GDB就使用shell命令
10. make <make-args>不退出GDB就重新编译程序
11. set args指定运行时参数。(如:set args10 20 30 40 50)
showargs查看设置好的运行参数。
12. path <dir>设定程序的运行路径。
showpaths 查看程序的运行路径。
13. set environment varname [=value] 设置环境变量。如:setenv USER=hchen
showenvironment [varname] 查看环境变量。
14. 其他
cd<dir> 相当于shell的cd命令。
pwd 显示当前的所在目录。
infoterminal 显示程序用到的终端模式。
tty指写输入输出的终端设备。如:tty /dev/ttyb
until在一个循环体内单步跟踪时,该命令运行程序到退出循环体。简写u
四、多线程调试
用gdb调试的好处是可以查看程序运行时的堆栈等信息,可以很直观的发现问题。
info threads //显示当前可调试的所有线程,每个线程前面有一个gdb为其分配的ID;
thread ID //切换到该ID对应的线程;
bt //显示该线程的堆栈信息
thread apply all bt //显示所有线程堆栈信息
break fun.c:123 thread ID //设置指定线程的断点
set scheduler-locking off|on|step //off表示不锁定任何线程,所有线程都执行;on只有当前线程执行;step在单步时除了next过一个函数外,只有当前线程执行
gdb使用_转的更多相关文章
- 使用gdb调试游戏服务器
前言 谈论gdb重要性 一般来说.提gdb,命令用于调试."命令",用户是几乎相同的复杂话.而事实确实如此,实际的开发调试必须用到gdb. 如今.大多数Linux系统是存在于ser ...
- Linux安全审计命令
安全审计 数据分析 capinfos xxx.pcap 产看数据包基本信息 日志分析 who /var/log/wtmp #查看登录用户信息 哈希校验 sha265 文件名 md5sum 文件名 &g ...
- rust-vmm 学习
V0.1.0 feature base knowledge: Architecture of the Kernel-based Virtual Machine (KVM) 用rust-vmm打造未来的 ...
- nginx模块_使用gdb调试nginx源码
工欲善其事必先利其器,如何使用调试工具gdb一步步调试nginx是了解nginx的重要手段. ps:本文的目标人群是像我这样初接触Unix编程的同学,如果有什么地方错误请指正. 熟悉gdb的使用 这里 ...
- arcgis gdb含下划线_和%的查询 by gisoracle
XMMC LIKE '%\_%' ESCAPE '\' by gisoracle 2015.1.25 XMMC LIKE '%\%%' escape '\' ...
- GDB调试笔记
参考资料:GDB调试精粹及使用实例 # 调试实例 #include <iostream> #include <cstring> using namespace std; ][] ...
- ubuntu: qemu+gdb 调试linux kernel 学习笔记
声明: 本笔记内容并非本人原创,90%来自网络资料的整合.同时,由于自己是刚刚接触qemu & gdbserver remote debug,本文也就算不得教程,仅供有缘人参考而已. ---- ...
- ArcGIS10的GDB文件解析(初步)
早就应该写一写关于esri的一些改变 参考http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#//006z000000tr00000 ...
- Linux学习笔记15——GDB 命令详细解释【转】
GDB 命令详细解释 Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工 ...
随机推荐
- HTML&CSS----练习隐藏导航栏(初级)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Nova相关命令收集
1. nova list 2. sudo nova-manage service list 8. 创建/删除浮动IP池 nova floating-ip-bulk-create 192.168.0.2 ...
- [办公自动化]skydrive onedrive
国内暂时无法访问onedrive,请按如下步骤操作尝试:依次如下:在开始菜单里,单击“所有程序”,找到“附件”,单击找到里面的“记事本”,右键,然后选择“以管理员身份运行”,如果有对话框,选择“是”. ...
- DS实验题 word
题目: 代码: // // main.cpp // word // // Created by wasdns on 16/11/11. // Copyright © 2016年 wasdns. All ...
- Javascript 笔记与总结(2-4)Javascript 内置对象
① String 字符串对象 fromCharCode() 静态方法, 用作为参数而传递的字符代码创建一个新的字符串. length 字符串的长度. charAt() 抽取字符串中指定位置的字符. c ...
- debug和release转载
Debug和Release区别 转自草原和大树 VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下 ...
- Bootstrap页面布局19 - BS提示信息
提示信息的设计 提示信息的类: .alert:提示信息类 .alert alert-danger: .alert alert-error: .alert alert-success: .alert a ...
- 【转载】Http协议
HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...
- 2认识HTML中的“ML”:深入理解超文本
HTML是描述网页结构的标记语言(即HTML中的'ML'),而HT指把一个网页链接到其他网页. <a>元素可以创建超文本链接到另外一个网页,<a>元素中的内容在网页中是可点击的 ...
- php常用代码
$total_count = mysql_num_rows($rslt);//返回记录条数 date("ymdHis");//130618104741 注:年份没有前两位 PHP手 ...