gdb 技巧学习
2015-12-17 16:12
162 查看
1. until
这个用于执行完循环。
在执行完循环体内的最后一条语句之后执行 until, 就会执行完循环体到后面的一个语句停下。
2. finish
执行完当前的函数。
3. tui
是一个命令行的界面,能同时把代码显示出来。
show scheduler-locking gdb线程调试 显示线程状态
set scheduler-locking on gdb调试加锁当前线程,其他线程停止
. 多线程下禁止线程切换:set scheduler-locking on
debug多进程:
默认情况下,当fork一个子进程之后,gdb会继续debug父进程,而子进程会运行下去.不过我们能够改变这个.
set follow-fork-mode mode 这里mode可以为parent或者child. parent是默认值,而child的话就是gdb继续debug子进程,而父进程会运行下去.
如果你想要同时debug父子进程,也可以设置:
set detach-on-fork mode 默认是on,也就是只能debug一个进程,如果改为off则可以同时debug父子进程.
保存一个书签稍后返回.
checkpoint 保存当前的程序的状态.
restart checkpoint-id 返回到checkpoint-id那个点.这个值可以用info checkpoint来查看
breakpoint,watchpoint以及catchpoint
breakpoint 就是断点.
watchpoint 就是用来检测变量的改变,他可以看做是特殊的断点,也就是当变量改变时停止程序.
catchpoint 是另外一种特殊的断点,用来监测某一事件的发生,有点类似其它语言中的异常.
gdb可以监测在你的程序中的任何信号。
来看命令。
handle signal [keywords...]
这个命令用来改变信号signal(名字或者数字)在gdb中的行为。
其中关键就是keywords.在这里keywords可以为下面几种类型:
1 nostop gdb接收到信号不会停止程序,而只是打印出一段message
2 stop 和上面类似只不过会停止程序。
3 print 当信号发生必须打印一条消息通知。
4 noprint 信号发生,gdb将不会打印任何东西。
5 pass和noignore 这两个是同义的。表示信号对你的程序是可见的。
6 nopass和ignore 这两个也是同义的。和上面相反。。
调试宏:在GCC编译程序的时候,加上-ggdb3参数,就可以了
info macro – 你可以查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
macro – 你可以查看宏展开的样子。
x命令是用来查看内存的,在gdb中 “help x” 你可以查看其帮助。
x/x 以十六进制输出
x/d 以十进制输出
x/c 以单字符输出
x/i 反汇编 – 通常,我们会使用 x/10i $ip-20 来查看当前的汇编($ip是指令寄存器)
x/s 以字符串输出
二 调试多进程
GDB多线程调试的基本命令:
info threads 查看当前进程的线程。
thread <ID> 切换调试的线程为指定ID的线程。
break [LOCATION] [thread THREADNUM] [if CONDITION] 在[LOCATION]处为[thread THREADNUM]设置断点在满足条件[if CONDITION]时停住 。
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。
thread apply all command 让所有被调试线程执行GDB命令command。
set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
off 不锁定任何线程,也就是所有线程都执行,这是默认值。
on 只有当前被调试程序会执行。
step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
other:
gdb中的变量以$开头,比如你想打印一个数组中的个个元素,你可以这样:
(gdb) set $i = 0
(gdb) p a[$i++]
--------------------------------------------我是分割线----------------------------
sudo apt-cache search package 搜索包
这个用于执行完循环。
在执行完循环体内的最后一条语句之后执行 until, 就会执行完循环体到后面的一个语句停下。
2. finish
执行完当前的函数。
3. tui
是一个命令行的界面,能同时把代码显示出来。
show scheduler-locking gdb线程调试 显示线程状态
set scheduler-locking on gdb调试加锁当前线程,其他线程停止
. 多线程下禁止线程切换:set scheduler-locking on
debug多进程:
默认情况下,当fork一个子进程之后,gdb会继续debug父进程,而子进程会运行下去.不过我们能够改变这个.
set follow-fork-mode mode 这里mode可以为parent或者child. parent是默认值,而child的话就是gdb继续debug子进程,而父进程会运行下去.
如果你想要同时debug父子进程,也可以设置:
set detach-on-fork mode 默认是on,也就是只能debug一个进程,如果改为off则可以同时debug父子进程.
保存一个书签稍后返回.
checkpoint 保存当前的程序的状态.
restart checkpoint-id 返回到checkpoint-id那个点.这个值可以用info checkpoint来查看
breakpoint,watchpoint以及catchpoint
breakpoint 就是断点.
watchpoint 就是用来检测变量的改变,他可以看做是特殊的断点,也就是当变量改变时停止程序.
catchpoint 是另外一种特殊的断点,用来监测某一事件的发生,有点类似其它语言中的异常.
gdb可以监测在你的程序中的任何信号。
来看命令。
handle signal [keywords...]
这个命令用来改变信号signal(名字或者数字)在gdb中的行为。
其中关键就是keywords.在这里keywords可以为下面几种类型:
1 nostop gdb接收到信号不会停止程序,而只是打印出一段message
2 stop 和上面类似只不过会停止程序。
3 print 当信号发生必须打印一条消息通知。
4 noprint 信号发生,gdb将不会打印任何东西。
5 pass和noignore 这两个是同义的。表示信号对你的程序是可见的。
6 nopass和ignore 这两个也是同义的。和上面相反。。
调试宏:在GCC编译程序的时候,加上-ggdb3参数,就可以了
info macro – 你可以查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
macro – 你可以查看宏展开的样子。
x命令是用来查看内存的,在gdb中 “help x” 你可以查看其帮助。
x/x 以十六进制输出
x/d 以十进制输出
x/c 以单字符输出
x/i 反汇编 – 通常,我们会使用 x/10i $ip-20 来查看当前的汇编($ip是指令寄存器)
x/s 以字符串输出
二 调试多进程
GDB多线程调试的基本命令:
info threads 查看当前进程的线程。
thread <ID> 切换调试的线程为指定ID的线程。
break [LOCATION] [thread THREADNUM] [if CONDITION] 在[LOCATION]处为[thread THREADNUM]设置断点在满足条件[if CONDITION]时停住 。
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。
thread apply all command 让所有被调试线程执行GDB命令command。
set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
off 不锁定任何线程,也就是所有线程都执行,这是默认值。
on 只有当前被调试程序会执行。
step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
other:
gdb中的变量以$开头,比如你想打印一个数组中的个个元素,你可以这样:
(gdb) set $i = 0
(gdb) p a[$i++]
--------------------------------------------我是分割线----------------------------
sudo apt-cache search package 搜索包
相关文章推荐
- 数据挖掘:K最近邻(KNN)算法的java实现
- SELECTOR
- shell脚本中导入mysql数据&&执行mysql语句
- Java输入输出流详解
- MathJax在IE中公式不解析
- java 读取ftp文件时特殊字符乱码
- PHPUnit测试私有属性和方法
- 半平面交总结and模板
- android——生成或者下载的图片在相册中找不到
- 問題排查:index was out of range (1)
- python操作excel表格详解(xlrd/xlwt)
- php屏蔽错误消息
- jquery文件上传控件 Uploadify 问题记录
- jQuery formValidator表单验证插件常见问题
- Linux增加swap空间
- 单例模式最简洁全面的介绍
- JAVA设计模式--观察者模式
- CocoaPod
- 网页上如何做轻松筹的一个漂亮的标题
- Tomcat中的线程池原理(APR和ThreadPool)