GDB基本使用方法
GDB是用来调试用户态程序的一款工具,可以追踪程序运行轨迹,打出调用栈,寄存器内容,查看内存等等
首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的-g 参数可以做到这一点。如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
启动GDB
直接找到gdb的路径执行就ok,进入GDB后可以输入help命令查看帮助信息
加载可执行文件启动
gdb executable-file
set args 参数列表
以上两步等同于
gdb –args executable-file 参数列表
run或者start都可以启动调试
多用于调试启动阶段就异常的程序
调试正在运行的程序
以下三种形式都可以attach到正在运行的程序上调试
ps -ef | grep http
www-data 24470 1 0 Jan17 ? 00:00:14 /usr/sbin/lighttpd
gdb attach 24470
gdb --pid 24470
gdb -p 24470
设置断点
break -- Set breakpoint at specified line or function
b func1
break func1 设置在func1处
b file:line 设置在文件的第几行处
b *0x指令地址设置在具体的某条汇编指令处
设置断点后,代码执行到func1处会被断住,方便我们查看当时的信息
打印调用栈
backtrace
bt
如果你要查看栈下面层的详细信息
frame 栈中的层编号
查看所有断点
info break
删除断点
delete 断点号
如果不加断点号为删除全部断点
禁用断点
disable 断点号
启用断点
enable 断点号
单步执行
next
或
n
单步进入
step
或
s
查看寄存器信息
info registers
i r
寄存器知识
pc 当前要执行的指令
sp 当前的栈地址
ra 当前调用返回地址,从当前函数栈返回后执行的第一条指令地址
v0 存储返回值
v1 当v0存储不下时使用
a0,a1,a2,a3 对应函数入参的第一,第二,第三,第四个参数,如果有更多参数,会压到当前栈中,调用的函数会去相应的位置取出来处理
t9 一般存放函数跳转地址
打印信息
print 变量或地址
查看内存信息
x/32xw 0x内存地址
以x:16进制的形式显示32w(32个字,一个字= 4B)的内存信息
反汇编函数
disassemble 函数地址
disassemble 函数名
线程断点
在线程号为id的线程上设置断点
break func thread id ,
如果你不指定thread 则表示你的断点设在所有线程上面
info threads 命令可以查看线程id号
thread id 可以切换到线程号为id的线程上,然后查看当前线程的寄存器及调用栈
当你的程序被GDB停住时,所有的运行线程都会被停住
调试core文件
Core文件是程序非法执行后core dump后产生的文件。
gdb –c coreFile binFile
注意事项,gdb调试core文件时会占用大量内存,出现vtysh(终端)被系统杀死的情况,一般需要留35M以上的内存
查看内存
cat /proc/meminfo
MemFree: 74732 kB
调试web_main
netstat -ple | grep web_main
9554 12705/web_main /var/usock/web_main.socket-0
9557 12707/web_main /var/usock/web_main.socket-1
一般挂住该进程,如果不准确,可以修改vi /etc/lighttpd/lighttpd.conf 查找min到该处,把2改为1,重启httpd服务/etc/init.d/httpd restart "socket" => "/var/usock/web_main.socket",
"bin-path" => "/var/local/web/func/web_main",
"check-local" => "disable",
"min-procs" => 2,
"max-procs" => 2,
自定义输出查看当前进程状态
ps -eTo tid,pid,wchan:32,comm| grep sslvpn
12592 12592 epoll_wait sslvpn
10110 12592 futex_wait_queue_me sslvpn
10111 12592 futex_wait_queue_me sslvpn
GDB基本使用方法 GDB是用来调试用户态程序的一款工具,可以追踪程序运行轨迹,打出调用栈,寄存器内容,查看内存等等 首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的-g 参数可以做到这一点。如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。 启动GDB 直接找到gdb的路径执行就ok,进入GDB后可以输入help命令查看帮助信息 加载可执行文件启动 gdb executable-file set args 参数列表 以上两步等同于 gdb –args executable-file 参数列表 run或者start都可以启动调试 多用于调试启动阶段就异常的程序 调试正在运行的程序 以下三种形式都可以attach到正在运行的程序上调试 ps -ef | grep http www-data 24470 1 0 Jan17 ? 00:00:14 /usr/sbin/lighttpd gdb attach 24470 gdb --pid 24470 gdb -p 24470 设置断点 break -- Set breakpoint at specified line or function b func1 break func1 设置在func1处 b file:line 设置在文件的第几行处 b *0x指令地址设置在具体的某条汇编指令处 设置断点后,代码执行到func1处会被断住,方便我们查看当时的信息 打印调用栈 backtrace bt 如果你要查看栈下面层的详细信息 frame 栈中的层编号 查看所有断点 info break 删除断点 delete 断点号 如果不加断点号为删除全部断点 禁用断点 disable 断点号 启用断点
2.4 实例—使用gdb调试器 1.编写实例程序gcctest.c,见2.2小节的开头部分 2.编译 3.启动GDB,执行程序 启动gdb,进入gdb调试环境,可以使用gdb的命令对程序进行调试。 [root@localhost gdbtest txt]# gdb //启动gdb GNU gdb Fedora (6.8-27.el5) Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later
在gdb中,断点通常有三种形式 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break,它通常有如下方式: 可以通过info breakpoints [n]命令查看当前断点信息。此外,还有如下几个配套的常用命令: 观察点(WatchPoint): 在变量读、写或变化时中断,这类方式常用来定位bug。
捕捉点(CatchPoint): 捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态链接库)、C++的异常等。通常也是用来定位bug。 捕捉点的命令格式是:catch
break
GDB命令大全 GDB的使用 当程序出错并产生core 时 快速定位出错函数的办法 gdb 程序名 core文件名(一般是core,也可能是core.xxxx) 调试程序使用的键 r run 运行.程序还没有运行前使用 c cuntinue 继续运行。运行中断后继续运行 q 退出 kill 终止调试的程序 h help 帮助
b breakpoint 设置断点。 用法: b 函数名对此函数进行中断 b 文件名:行号对此文件中指定行中断.如果是当前文件,那么文件名与:号可以省略 看当前断点数使用info break.禁止断点disable 断点号.删除delete 断点号. l list 列出代码行。一次列10 行。连接使用list将会滚动显示. 也可以在list 后面跟上文件名:行号 watch 观察一个变量的值。每次中断时都会显示这个变量的值 p print 打印一个变量的值。与watch不同的是print只显示一次 这里在顺便说说如何改变一个 value. 当你下指令 p 的时候,例如你用 p b, 这时候你会看到 b 的 value, 也就是上面的 $1 = 15. 你也同样可以用 p 来改变一个 value, 例如下指令 p b = 100 试试看,
这时候你会发现, b 的 value 就变成 100 了:$1 = 100. 网上抄录 基本的使用方法简介 前言 程序代码中的错误可分为数类,除了最容易除错的语法错误,编译程序会告诉你错误所在外,大部分的错误都可以归类为执行时错误。GDB 的功能便是寻找执行时错误。如果没有除错程序,我们只能在程序中加入输出变量值的指令来了解程序执行的状态。有了 GDB 除错程序,我们可以设定在任何地方停止程序的执行,然后可以随意检视变量值及更动变量,并逐行执行程序。 一个除错程序执行的流程通常是这样的: 1. 进入除错程序并指定可执行文件。 2. 指定程序代码所在目录。 3. 设定断点后执行程序。 4. 程序于断点中断后,可以 (1)检视程序执行状态;检视变量值或变更变量值 (2) 逐步执行程序,或是全速执行程序到下一个断点或是到程序结束为止。 5. 离开除错程序。 以下将分为下列数项分别介绍:
附录A:GDB使用 1.基本命令 1)进入GDB #gdb test test是要调试的程序,由gcctest.c -g -o test生成。进入后提示符变为(gdb) 。 2)查看源码(gdb) l 源码会进行行号提示。 如果需要查看在其他文件中定义的函数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。或者:使用断点或单步运行,到某个函数处使用s进入这个函数。 3)设置断点(gdb) b 6 这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号。 4)查看断点处情况(gdb) info b 可以键入"info b"来查看断点处情况,可以设置多个断点; 5)运行代码(gdb) r 6)显示变量值(gdb) p n 在程序暂停时,键入"p 变量名"(print)即可; GDB在显示变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作"$N",而无需写冗长的变量名; 7)观察变量(gdb) watch n 在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点; 8)单步运行(gdb) n 9)程序继续运行(gdb) c 使程序继续往下运行,直到再次遇到断点或程序结束; 10)退出GDB (gdb) q 2.断点调试 break+设置断点的行号,break n,在n行处设置断点; tbreak+行号或函数名,tbreak n/func,设置临时断点,到达后被自动删除; break+filename+行号, break main.c:10,用于在指定文件对应行设置断
GDB调试及实例 一:列文件清单 1.List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。 (gdb)set args –b –x (gdb) show args backtrace命令为堆栈提供向后跟踪功能。 Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。 三:显示数据 利用print 命令可以检查各个变量的值。 (gdb) print p (p为变量名) whatis 命令可以显示某个变量的类型 (gdb) whatis p type = int * print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容: l 对程序中函数的调用 (gdb) print find_entry(1,0) l 数据结构和其他复杂对象 (gdb) print *table_start $8={e=reference=’\000’,location=0x0,next=0x0} l 值的历史成分 (gdb)print $1 ($1为历史记录变量,在以后可以直接引用$1 的值) l 人为数组 人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示: base@length 因此,要想显示在h后面的10个元素,可以使用h@10: (gdb)print h@10 $13=(-1,345,23,-234,0,0,0,98,345,10)
1. 本文介绍使用gdb调试程序的常用命令。 主要内容: [简介] [举例] [其他] [简介] ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。同时GDB也具有例如ddd这样的图形化的调试端。 一般来说,GDB主要完成下面四个方面的功能: (1)启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 (2)可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) (3)当程序被停住时,可以检查此时你的程序中所发生的事。 (4)动态的改变你程序的执行环境。 [举例] ============= *启动gdb $gdb 这样可以和gdb进行交互了。 *启动gdb,并且分屏显示源代码: $gdb -tui 这样,使用了'-tui'选项,启动可以直接将屏幕分成两个部分,上面显示源代码,比用list方便多了。这时候使用上下方向键可以查看源代码,想要命令行使用上下键就用[Ctrl]n和[Ctrl]p. *启动gdb调试指定程序app: $gdb app 这样就在启动gdb之后直接载入了app可执行程序,需要注意的是,载入的app程序必须在编译的
时候有gdb调试选项,例如'gcc -g app app.c',注意,如果修改了程序的源代码,但是没有编译,那么在gdb中显示的会是改动后的源代码,但是运行的是改动前的程序,这样会导致跟踪错乱的。 *启动程序之后,再用gdb调试: $gdb
常用的gdb命令 backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)breakpoint 在程序中设置一个断点 cd 改变当前工作目录 clear 删除刚才停止处的断点 commands 命中断点时,列出将要执行的命令 continue 从断点开始继续执行 delete 删除一个断点或监测点;也可与其他命令一起使用 display 程序停止时显示变量和表达时 down 下移栈帧,使得另一个函数成为当前函数 frame 选择下一条continue命令的帧 info 显示与该程序有关的各种信息 jump 在源程序中的另一点开始运行 kill 异常终止在gdb 控制下运行的程序 list 列出相应于正在执行的程序的原文件内容 next 执行下一个源程序行,从而执行其整体中的一个函数 print 显示变量或表达式的值 pwd 显示当前工作目录 pype 显示一个数据结构(如一个结构或C++类)的内容 quit 退出gdb reverse-search 在源文件中反向搜索正规表达式 run 执行该程序 search 在源文件中搜索正规表达式 set variable 给变量赋值 signal 将一个信号发送到正在运行的进程 step 执行下一个源程序行,必要时进入下一个函数 undisplay display命令的反命令,不要显示表达式 until 结束当前循环 up 上移栈帧,使另一函数成为当前函数 watch 在程序中设置一个监测点(即数据断点) whatis 显示变量或函数类型
GDB命令分类详解 一:列文件清单 (2) 二:执行程序 (2) 三:显示数据 (2) 四:断点(breakpoint) (3) 五.断点的管理 (3) 六.变量的检查和赋值 (4) 七.单步执行 (4) 八.函数的调用 (4) 九.机器语言工具 (4) 十.信号 (4) 十一.原文件的搜索 (5) 十二. UNIX接口 (5) 十三. 命令的历史 (5) 十四. GDB帮助 (5) 十五. GDB多线程 (6) 十六. GDB使用范例 (7) 一:列文件清单 1.List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。 (gdb)set args –b –x (gdb) show args backtrace命令为堆栈提供向后跟踪功能。 Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。 三:显示数据 利用print 命令可以检查各个变量的值。 (gdb) print p (p为变量名) whatis命令可以显示某个变量的类型 (gdb) whatis p type = int * print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:
一,GDB调试器简介 GDB是Linux下的常用调试器,主要用于调试源代码、调试运行中的进程和查看core dump文件。Linux下的调试器主要有gdb、cgdb、ddd、eclipse。GDB调试器的运行速度快、能够进行源代码同步显示。 使用-tui 选项开启gdb命令输入和源代码的分屏显示,tui即Terminal User Interface。 二,GDB常用调试命令 a)调试可执行文件 以源代码为/home/zebra/目录下的test.c文件产生的可执行文件test为例(可执行文件使用gcc进行编译,并使用-g选项以产生调试信息),进行命令的说明(详细源代码参见第三部分:三,调试实例分析 )。 gdb调试源代码流程: 1,开启gdb程序,即运行如下命令:gdb -q (-q用以使得gdb不输出gdb程序的版本等信息)2,指定调试的二进制文件:file test 3,list查看源代码 4,设定断点breakpoint main breakpoint sub 上述分别在main函数和sub函数处设定了断点。 断点可以设置在任意已知源代码文件的某一行,某一个函数,同时可以指定是设置在哪个/哪些线程上(见下边描述)。 5,运行可执行文件: run 6,这样程序会运行到断点处停止下来,gdb会打印当前断点的信息。 7,使用s 或者n进行单步调试。 s即step,n即next都是执行一条语句,然后停下来。 如果想执行一条汇编语句,则可以使用si ,ni,即step instruction,next instruction。 8,bt命令查看当前的调用栈,bt即backtrace。 9,info frame查看函数帧信息。 10,frame n 进入某个函数帧(编号为n) 11,info 命令可以对当前的函数帧的寄存器、局部变量、函数的参数进行查看。 info register;info local;info args。 12,disassemble对当前函数对应的二进制进行反汇编。 13,x/nfu address 查看内存其中address是内存开始的地址,从该地址向高地址增加, x是examinate的缩写,n表示重复次数,f表示输出格式,u表示内存大小的单位(默认是字,即4个字节)。 一般我都用x/nx address,即打印n个从address开始的内存,每个是4字节,以十六进制打印。14,continue,执行至该函数退出 15,info threads,显示当前可调试的所有线程 16,thread
(转贴)linux 下的软件开发之GCC,GDB用法篇 -|tinylee 发表于 2005-8-22 1:02:00 在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器。目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等。 开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。在使用GCC编译程序时,编译过程可以被细分为四个阶段: ◆ 预处理(Pre-Processing) ◆ 编译(Compiling) ◆ 汇编(Assembling) ◆ 链接(Linking) Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。 GCC提供了30多条警告信息和三个警告级别,使用它们有助于增强程序的稳定性和可移植性。此外,GCC 还对标准的C和C++语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化,能够减轻编程的工作量。 GCC起步 在学习使用GCC之前,下面的这个例子能够帮助用户迅速理解GCC的工作原理,并将其立即运用到实际的项目开发中去。首先用熟悉的编辑器输入清单1所示的代码: 清单1:hello.c #i nclude
3.5.2 Gdb基本命令 Gdb的命令可以通过查看help进行查找,由于Gdb的命令很多,因此Gdb的he lp将其分成了很多种类(class),用户可以通过进一步查看相关class找到相应命令。如下所示: (gdb) help List of classes of commands: aliases -- Aliases of other commands breakpoints -- Making program stop at certain points data -- Examining data files -- Specifying and examining files internals -- Maintenance commands … Type "help" followed by a class name for a list of commands in that class. Type "help" followed by command name for full documentation. Command name abbreViations are allowed if unambiguous. 上述列出了Gdb各个分类的命令,注意底部的加粗部分说明其为分类命令。接下来可以具体查找各分类种的命令。如下所示: (gdb) help data Examining data. List of commands: call -- Call a function in the program delete display -- Cancel some expressions to be displayed when program stops delete mem -- Delete memory region
GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工 具。或许 ,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如 果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、 BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短” 就 是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序的执行环境。 从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成 这些功能,不过在细节上,你会发现GDB这个调试工具的强大, 大家 可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却 有着图形化工具所不能完成的功能。让我们一一看来。
源程序:tst.c 1 #include
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、 BCB的图形化调试器更强大的功能。同时GDB也具有例如ddd这样的图 形化的调试端。 一般来说,GDB主要完成下面四个方面的功能: (1)启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 (2)可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条 件表达式) (3)当程序被停住时,可以检查此时你的程序中所发生的事。 (4)动态的改变你程序的执行环境。 兴趣是最好的老师,这里先整理总结一下在调试的过程中经常遇到的问题。带着这些问题进行学习和实践可以有助于加深印象 (1)如何打印变量的值?(print var) (2)如何打印变量的地址?(print &var) (3)如何打印地址的数据值?(print *address) (4)如何查看当前运行的文件和行?(backtrace) (5)如何查看指定文件的代码?(list file:N) (6)如何立即执行完当前的函数,但是并不是执行完整个应用程序?(finish) (7)如果程序是多文件的,怎样定位到指定文件的指定行或者函数?(list file:N) (8)如果循环次数很多,如何执行完当前的循环?(until) (9)多线程如何调试?(???)
[举例] ============= *启动gdb $gdb 这样可以和gdb进行交互了。 *启动gdb,并且分屏显示源代码: $gdb -tui 这样,使用了'-tui'选项,启动可以直接将屏幕分成两个部分,上面显示源代码,比用list方便多了。这时候使用上下方向键可以查看源代码,想要命令行使用上下键就用[Ctrl]n和[Ctrl]p. *启动gdb调试指定程序app: $gdb app 这样就在启动gdb之后直接载入了app可执行程序,需要注意的是,载入的app程序必须在编译的时候有gdb调试选项,例如'gcc -g app app.c',注意,如果修改了程序的源代码,但是没有编译,那么在gdb中显示的会是改动后的源代码,但是运行的是改动前的程序,这样会导致跟踪错乱的。 *启动程序之后,再用gdb调试: $gdb
使用GDB 一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如: > cc -g hello.c -o hello > g++ -g hello.cpp -o hello 如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。 进入GDB 启动GDB的方法有以下几种: 1、gdb program program也就是你的执行文件,一般在当然目录下。 2、gdb program core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。 3、gdb pid 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。 GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数: 参数说明 -symbols [file](-s)读取文件中的符号表 -exec [file] (-e)调试一个可执行文件 -se [file]上二者的缩写 -core [file](-c)读入一个core dump文件 -pid number (-p)启动attach模式,除错一个执行中的行程。number 是目标行程的pid
-directory [directory] (-d)将directory加入原始码的搜寻路行 -readnow (-r)一次读取完所有的符号表,这会让启动gdb的时间变长,但在执行往后的除错动作会较快速。 下列还有部分选择性的参数,我列出几个目前用的到的: -quiet -silent -q安静模式,启动时gdb将不会显示版权页。 -windows -w与下一选项相反,这会启动GUI -nowindows -nw如果gdb有编入GUI的话,这个选项会关掉它。 -cd [directory]切换工作目录为directory而不是现在的目录 -tty [device](-t)指定device 为程式的标准输出入 --args这个参数要当作命令列的最后一个参数,其后跟随的参数都会被视为「欲传给将调试的程序的参数」 当然我们也不一定要在启动时指定调试来源。 file指令可以指定要调试的程序,功能就与-se一样,其实这样指定是比较方便的。 在执行程序前,我们可以先指定命令列参数,如同--args参数的效果。 程序运行参数 set args指定运行时的命令列参数 show args查看现在的命令列参数是什么。由于gdb调试的对象是已经编译好的可执行文件,所以这里我们不必像https://www.doczj.com/doc/0713503323.html,一样等半天。有一点必须注意,gdb传给程序的命令列参数是程序开始执行前的那一份命令列参数,如果程序已经开始执行,就算用中断点中断执行然后改变命令列参数,也只会在下一次执行时变更才会生效。 运行环境 path设定程序的运行路径。 show paths 查看程序的运行路径。 set environment varname [=value] 设置环境变量,如set env USR = show environment [varname] 查看环境变量。 工作目录 cd相当于shell的cd命令。
GDB教程 GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提供了极大的便利,命令行软件的优势在于,他们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。 于是UNIX下的软件比windows下的软件更能有机的结合,各自发挥各自的长处,组合成更为强筋的功能。而windows下的图形软件基本上各自为营,互相不能条用,很不利于各种软件的相互集成。在这里并不是要和windows做个什么比较,所谓“寸有所长,尺有所短”,图形化工具还是有不如命令行的地方。 用GDB调试程序 GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下调试程序工具。或许各位比较喜欢那种图形界面方式的,像VC,BCB等IDE的调试,但如果你是在UNIX平台下作软件,你会发现GDB这个调试工具有比VC,BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,GDB主要帮助你完成下面四个方面的功能: 1、启动你的程序,可以按照你自定义的要求随心所欲的运行程序。 2、可以让调试程序在你所指定的位置的断点处停止。 3、当程序停止时,可以检查此时你的程序中所发生的事情。 4、动态的改变你程序的执行环境。 从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能习惯图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。 让我们来看一个例子: 源程序:test.c 1#include GDB使用说明文档 一、简介: GDB能让你观察一个程序在执行时的内部活动,或程序出错时发生了什么。 GDB主要能为你做以下四件事,帮助你找出程序中的错误。 1.运行你的程序,设置所有的能影响程序运行的东西。 2.保证你的程序在指定的条件下停止。 3.当你程序停止时,让你检查发生了什么。 4.改变你的程序。那样你可以试着修正某个bug引起的问题,然后继续查找另一个 bug. 二、GDB运行方式 1.通常的调试可执行程序:gdb <可执行文档名> 2.调试执行文件指定一个core文件:gdb <可执行文件名> core 3.为执行的文件指定一个进程号:gdb <可执行文件名> <进程号> 三、GDB常用命令 下面先说明GDB的基本指令:(大部分命令使用时只要输入第一个字母就好了,同时支持TAB的自动补全,与shell相类似) 1.help:查看帮助 2.file:指定一个可执行文件进行调试,gdb将读取些文件的调试信息 3.list:列出程序源文件 4.run:装载完要调试的可执行文件后,可以用run命令运行可执行文件 5.break:设置断点breakpoint,如b 25,则在源程序的第25行设置一个断点,当程序 执行到第25行时,就会产生中断;也可以使用b funcname,funcname为函数的名称,当程序调用些函数时,则产生中断 6.continue:c命令可以使中断的程序继续执行,直到下一个中断点或程序结束 7.print:输入某个变量的值,如程序定义了一个int aa的就是,p aa就会输出aa的当 前值 8.next:程序执行到断点时中断执行,可以用n指令进行单步执行 9.step:程序执行到断点时中断执行,可以用s指令进行单步执行进某一函数,如果已经 进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish 10.attach:命令为attach PROCESS-ID,这个命令把一个已经运行的进程(在gdb外启动) 连接入gdb,以便调试。PROCESS-ID是进程号,当gdb接到attach命令后第一件事就是停止进程的运行 11.detach:与attach相对应,不多解释 12.thread:命令为thread THREADNO,把线程号为THREADNO的线程设为当前线程。命令 行参数THREADNO是gdb内定的线程号。你可以用info threads命令来查看gdb内设置的线程号 13.kill: 终止正在调试的程序 14.watch:使你能监视一个变量的值而不管它何时改变, 当表达式的值被改变时GDB就使 程序停止,还有rwatch是使程序暂停 15.clear:使用clear命令你可以删除指定位置的断点,如:clear FUNCTION, clear LINENUM,也可以使用delete命令通过断点号来指定要删去的断点或观察点,如果没有指定参数则删去程序中所有的断点 16.make:使你能不退出gdb就可以重新产生可执行文件 17.shell:使你能不退出gdb就可以执行shell命令 Linux 下C 语言编程如何使用gdb 使用GCC GCC 选项GCC 有超过100个的编译选项可用. 这些选项中的许多你可能永远都不会用到, 但一些主要的选项将会频繁用到. 很多的GCC 选项包括一个以上的字符. 因此你必须为每个选项指定各自的连字符, 并且就象大多数Linux 命令一样你不能在一个单独的连字符后跟一组选项. 例如, 下面的两个命令是不同的: gcc -p -g test.c gcc -pg test.c 第一条命令告诉GCC 编译test.c 时为prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里. 第二条命令只告诉GCC 为gprof 命令建立剖析信息. 注意:当你使用-o 选项时, -o 后面必须跟一个文件名. GCC 同样有指定编译器处理多少的编译选项. -c 选项告诉GCC 仅把源代码编译为目标代码而跳过汇编和连接的步骤. 这个选项使用的非常频繁因为它使得编译多个C 程序时速度更快并且更易于管理. 缺省时GCC 建立的目标代码文件有一个 .o 的扩展名. -S 编译选项告诉GCC 在为C 代码产生了汇编语言文件后停止编译. GCC 产生的汇编语言文件的缺省扩展名是 .s . -E 选项指示编译器仅对输入文件进行预处理. 当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里. 优化选项当你用GCC 编译 C 代码时, 它会试着用最少的时间完成编译并且使编译后的代码易于调试. 易于调试意味着编译后的代码与源代码有同样的执行次序, 编译后的代码没有经过优化. 有很多选项可用于告诉GCC 在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件. 这些选项中最典型的是-O 和-O2 选项. -O 选项告诉GCC 对源代码进行基本优化. 这些优化在大多数情况下都会使程序执行的更快. -O2 选项告诉GCC 产生尽可能小和尽可能快的代码. -O2 选项将使编译的速度比使用-O 时慢. 但通常产生的代码执行速度会更快. 除了-O 和-O2 优化选项外, 还有一些低级选项用于产生更快的代码. 这些选项非常的特殊, 而且最好只有当你完全理解这些选项将会对编译后的代码产生什么样的效果时再去使用. 这些选项的详细描述, 请参考GCC 的指南页, 在命令行上键入man gcc . 调试和剖析选项GCC 支持数种调试和剖析选项. 在这些选项里你会最常用到的是-g 和-pg 选项. -g 选项告诉GCC 产生能被GNU 调试器使用的调试信息以便调试你的程序. GCC 提供了一个很多其他C 编译器里没有的特性, 在GCC 里你能使-g 和-O (产生优化代码)联用. 这一点非常有用因为你能在与最终产品尽可能相近的情况下调试你的代码. 在你同时使用这两个选项时你必须清楚你所写的某些代码已经在优化时被GCC 作了改动. 关于调试C 程序的更多信息请看下一节"用gdb 调试 C 程序" . -pg 选项告诉GCC 在你的程序里加入额外的代码, 执行时, 产生gprof 用的剖析信息以显示你的程序的耗时情况. 关于gprof 的更多信息请参考"gprof" 一节. 用gdb 调试GCC 程序Linux 包含了一个叫gdb 的GNU 调试程序. gdb 是一个用来调试 C 和C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部GDB使用说明
Linux如何使用gdb