一、gdb的安装
由于这是进阶的介绍,如果不会安装请自行百度;
二、调试前的准备
用gcc编译源程序的时候,编译后的可执行文件不会包含源程序代码,如果您打算编译后的程序可以被调试,编译的时候要加-g的参数,例如:
gcc -g -o aa demo.c
在命令提示符下输入gdb aa就可以调试demo.c程序了;
gdb aa
三、基本调试命令
如果set args 的参数带有特殊名字,需要用双引号"aaa bbb"
四、程序挂掉时,系统缺省不会生成core文件
有段错误的代码
#include<stdio.h>
void fun(int aaa)
{
int *p =NULL;
*p=aaa;
}
int main(int argc,char*argv[])
{
int a = 10;
printf("a=%d\n",a);
char* name="Zhang San";
printf("name=%s\n",name);
if(argc != 3)
{
printf("no enough params\n");
}
fun(13);
printf("Hello World\n");
return 0;
}
gcc -g -o mm Coredump.c
1、ulimit -a 查看系统参数
2、 ulimit -c unlimit 把core文件的大小设置为无限制
3、运行程序,生成core文件:./mm
4、gdb 程序名 core文件名
五、GDB调试正在运行的程序
gdb 可执行程序 -p 进程pid
bt
n
六、调试多进程
调试父进程 :set follow-fork-mode-parent(缺省也是调试父进程)
调试子进程 :set follow-fork-mode-child
设置调试模式:set detach-on-fork [on/off]
set detach-on-fork on 调试当前进程,其他进程也运行
set detach-on-fork off 调试当前进程,其他进程不运行
查看调试的进程: info inferiors
切换当前调试的进程: inferiors 进程ID 0/1(注:不是PID)
七、调试多线程
在shell中运行:
查看当前运行的进程: ps -aux|grep a.out
查看当前轻量级进程(即线程): ps -aL|grep a.out
查看主线程和子线程的关系:pstree -p 主线程的ID
在gdb中执行:
查看线程:info threads
切换线程: thread 线程ID
只运行当前线程: set scheduler-locking on
运行所有线程: set scheduler-locking off
指定某线程执行gdb命令:thread apply 线程ID cmd(n)
全部线程执行gdb命令:thread apply all cmd(n)