test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。shell
源码会进行行号提示。ubuntu
若是须要查看在其余文件中定义的函数,在l后加上函数名便可定位到这个函数的定义及查看附近的其余源码。或者:使用断点或单步运行,到某个函数处使用s进入这个函数。多线程
这样会在运行到源码第6行时中止,能够查看变量的值、堆栈状况等;这个行号是gdb的行号。app
能够键入"info b"来查看断点处状况,能够设置多个断点;函数
运行代码:(gdb) rui
显示变量值:(gdb) p n操作系统
在程序暂停时,键入"p 变量名"(print)便可;线程
GDB在显示变量值时都会在对应值以前加上 N N",而无需写冗长的变量名;debug
在某一循环处,每每但愿可以观察一个变量的变化状况,这时就能够键入命令"watch"来观察变量的变化状况,GDB在"n"设置了观察点;unix
单步运行:(gdb) n
程序继续运行:(gdb) c
使程序继续往下运行,直到再次遇到断点或程序结束;
命令格式 | 例子 | 做用 |
---|---|---|
break + 设置断点的行号 | break n | 在n行处设置断点 |
tbreak + 行号或函数名 | tbreak n/func | 设置临时断点,到达后被自动删除 |
break + filename + 行号 | break main.c:10 | 用于在指定文件对应行设置断点 |
break + <0x...> | break 0x3400a | 用于在内存某一位置处暂停 |
break + 行号 + if + 条件 | break 10 if i==3 | 用于设置条件断点,在循环中使用很是方便 |
info breakpoints/watchpoints [n] | info break | n表示断点编号,查看断点/观察点的状况 |
clear + 要清除的断点行号 | clear 10 | 用于清除对应行的断点,要给出断点的行号,清除时GDB会给出提示 |
delete + 要清除的断点编号 | delete 3 | 用于清除断点和自动显示的表达式的命令,要给出断点的编号,清除时GDB不会给出任何提示 |
disable/enable + 断点编号 | disable 3 | 让所设断点暂时失效/使能,若是要让多个编号处的断点失效/使能,可将编号之间用空格隔开 |
awatch/watch + 变量 | awatch/watch i | 设置一个观察点,当变量被读出或写入时程序被暂停 |
rwatch + 变量 | rwatch i | 设置一个观察点,当变量被读出时,程序被暂停 |
catch | 设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态连接库)或是C++的异常 | |
tcatch | 只设置一次捕捉点,当程序停住之后,应点被自动删除 |
命令格式 | 例子 | 做用 |
---|---|---|
display +表达式 | display a | 用于显示表达式的值,每当程序运行到断点处都会显示表达式的值 |
info display | 用于显示当前全部要显示值的表达式的状况 | |
delete + display 编号 | delete 3 | 用于删除一个要显示值的表达式,被删除的表达式将不被显示 |
disable/enable + display 编号 | disable/enable 3 | 使一个要显示值的表达式暂时失效/使能 |
undisplay + display 编号 | undisplay 3 | 用于结束某个表达式值的显示 |
whatis + 变量 | whatis i | 显示某个表达式的数据类型 |
print(p) + 变量/表达式 | p n | 用于打印变量或表达式的值 |
set + 变量 = 变量值 | set i = 3 | 改变程序中某个变量的值 |
命令格式 | 例子 | 做用 |
---|---|---|
set args | set args arg1 arg2 | 设置运行参数 |
show args | show args | 参看运行参数 |
set width + 数目 | set width 70 | 设置GDB的行宽 |
cd + 工做目录 | cd ../ | 切换工做目录 |
run | r/run | 程序开始执行 |
step(s) | s | 进入式(会进入到所调用的子函数中)单步执行,进入函数的前提是,此函数被编译有debug信息 |
next(n) | n | 非进入式(不会进入到所调用的子函数中)单步执行 |
finish | finish | 一直运行到函数返回并打印函数返回时的堆栈地址和返回值及参数值等信息 |
until + 行数 | u 3 | 运行到函数某一行 |
continue(c) | c | 执行到下一个断点或程序结束 |
return <返回值> | return 5 | 改变程序流程,直接结束当前函数,并将指定值返回 |
call + 函数 | call func | 在当前位置执行所要运行的函数 |
命令格式 | 例子 | 做用 |
---|---|---|
backtrace/bt | bt | 用来打印栈帧指针 |
frame | frame 1 | 用于打印指定栈帧 |
info reg | info reg | 查看寄存器使用状况 |
info stack | info stack | 查看堆栈使用状况 |
up/down | up/down | 跳到上一层/下一层函数 |
backtrace/bt 也能够在该命令后加上要打印的栈帧指针的个数,查看程序执行到此时,是通过哪些函数呼叫的程序,程序“调用堆栈”是当前函数以前的全部已调用函数的列表(包括当前函数)。每一个函数及其变量都被分配了一个“帧”,最近调用的函数在 0 号帧中(“底部”帧)
set args 可指定运行时参数。(如:set args 10 20 30 40 50) show args 命令能够查看设置好的运行参数。
path 可设定程序的运行路径。 show paths 查看程序的运行路径。 set environment varname [=value] 设置环境变量。如:set env USER=hchen show environment [varname] 查看环境变量。
cd 至关于shell的cd命令。 pwd 显示当前的所在目录。
info terminal 显示你程序用到的终端的模式。 使用重定向控制程序输出。如:run > outfile tty命令能够指写输入输出的终端设备。如:tty /dev/ttyb
两种方法: (1)在UNIX下用ps查看正在运行的程序的PID(进程ID),而后用gdb PID格式挂接正在运行的程序。 (2)先用gdb 关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。
序运行当进程被gdb停住时,你可使用info program 来查看程序的是否在运行,进程号,被暂停的缘由。 在gdb中,咱们能够有如下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程中止(Thread Stops),若是要恢复程序运行,可使用c或是continue命令。
若是程序是多线程,能够定义断点是否在全部的线程上,或是在某个特定的线程。 break thread break thread if ... linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,能够经过“info threads”命令来查看正在运行程序中的线程信息。若是不指定thread 则表示断点设在全部线程上面。还能够为某线程指定断点条件。如: (gdb) break frik.c:13 thread 28 if bartab > lim 当你的程序被GDB停住时,全部的运行线程都会被停住。这方便查看运行程序的整体状况。而在你恢复程序运行时,全部的线程也会被恢复运行。
Core Dump:Core的意思是内存,Dump的意思是扔出来,堆出来。开发和使用Unix程序时,有时程序莫名其妙的down了,却没有任何的提示(有时候会提示core dumped),这时候能够查看一下有没有形如core.进程号的文件生成,这个文件即是操做系统把程序down掉时的内存内容扔出来生成的, 它能够作为调试程序的参考
生成Core文件
通常默认状况下,core file的大小被设置为了0,这样系统就不dump出core file了。修改后才能生成core文件。 #设置core大小为无限 ulimit -c unlimited #设置文件大小为无限 ulimit unlimited 这些须要有root权限, 在ubuntu下每次从新打开中断都须要从新输入上面的第一条命令, 来设置core大小为无限 core文件生成路径:输入可执行文件运行命令的同一路径下。若系统生成的core文件不带其余任何扩展名称,则所有命名为core。新的core文件生成将覆盖原来的core文件。 1)/proc/sys/kernel/core_uses_pid能够控制core文件的文件名中是否添加pid做为扩展。文件内容为1,表示添加pid做为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。 可经过如下命令修改此文件: echo "1" > /proc/sys/kernel/core_uses_pid 2)proc/sys/kernel/core_pattern能够控制core文件保存位置和文件名格式。 可经过如下命令修改此文件: echo "/corefile/core-%e-%p-%t" > core_pattern,能够将core文件统一辈子成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳 如下是参数列表: %p - insert pid into filename 添加pid %u - insert current uid into filename 添加当前uid %g - insert current gid into filename 添加当前gid %s - insert signal that caused the coredump into the filename 添加致使产生core的信号 %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间 %h - insert hostname where the coredump happened into filename 添加主机名 %e - insert coredumping executable name into filename 添加命令名
发生core dump以后, 用gdb进行查看core文件的内容, 以定位文件中引起core dump的行. gdb [exec file] [core file] 如: gdb ./test core 或gdb ./a.out core-file core.xxxx gdb后, 用bt命令backtrace或where查看程序运行到哪里, 来定位core dump的文件->行. 待调试的可执行文件,在编译的时候须要加-g,core文件才能正常显示出错信息 1)gdb -core=core.xxxx file ./a.out bt 2)gdb -c core.xxxx file ./a.out bt
启动进程 gdb -p PID c 运行进程至crash gdb会显示crash信息 bt