程序调试命令gdb

锁定线程
 set scheduler-locking

1.要使用此命令,先用gcc -g编译程序,如:
  $gcc -g test.c -o test
  编译test.c源程序,输入此程序的调试版本test

2.调试程序
  $gdb test //调试可执行程序test
  $(gdb)start //使用程序test开始运行
 
  列出指定函数的源代码,或列出指定行号开始的源程序
  $(gdb)list 函数名
  $(gdb)list 行号
 
  backtrace(或bt) 查看各级函数调用及参数
finish 连续运行到当前函数返回为止,然后停下来等待命令
frame(或f) 帧编号 选择栈帧
info(或i) locals 查看当前栈帧局部变量的值
list(或l) 列出源代码,接着上次的位置往下列,每次列10行
list 行号 列出从第几行开始的源代码
list 函数名 列出某个函数的源代码
next(或n) 执行下一行语句
print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数
quit(或q) 退出gdb调试环境
set var 修改变量的值
start 开始执行程序,停在main函数第一行语句前面等待命令
step(或s) 执行下一行语句,如果有函数调用则进入到函数中

http://www.zeuux.org/science/learning-gdb.cn.html

GDB 命令行参数
启动 GDB:

gdb executable
gdb -e executable -c core-file
gdb executable -pid process-id
(使用命令 ‘ps -auxw‘ 可以查看进程的 pid)
选项 含义
--help
-h 列出命令行参数。
--exec=file
-e file 指定可执行文件。
--core=core-file
-c core-file 指明 core 文件。
--command=file
-x file 从指定文件中读取 gdb 命令。
--directory=directory
-d directory 把指定目录加入到源文件搜索路径中。
--cd=directory 以指定目录作为当前路径来运行 gdb 。
--nx
-n 不要执行 .gdbinit 文件中的命令。默认情况下,这个文件中的命令会在所有命令行参数处理完后被执行。
--batch 在非交互模式下运行 gdb 。从文件中读取命令,所以需要 -x 选项。
--symbols=file
-s file 从指定文件中读取符号表。
-write 允许对可执行文件和 core 文件进行写操作。
--quiet
-q 不要打印介绍和版权信息。
--tty=device 指定 device 为运行程序的标准输入输出。
--pid=process-id
-p process-id
 指定要附属的进程 ID 。

GDB 命令
GDB 中使用的命令:

命令 描述
help 列出 gdb 帮助信息。
help topic 列出相关话题中的 gdb 命令。
help command 列出命令描述信息。
apropos search-word 搜索相关的话题。
info args
i args 列出运行程序的命令行参数。
info breakpoints 列出断点。
info break 列出断点号。
info break breakpoint-number 列出指定断点的信息。
info watchpoints 列出观察点。
info registers 列出使用的寄存器。
info threads 列出当前的线程。
info set 列出可以设置的选项。
Break and Watch 
 
break funtion
break line-number 在指定的函数,或者行号处设置断点。
break +offset
break -offset 在当前停留的地方前面或后面的几行处设置断点。
break file:func 在指定的file文件中的func处设置断点。
break file:nth 在指定的file文件中的第nth行设置断点。
break *address 在指定的地址处设置断点。一般在没有源代码时使用。
break line-number if condition 如果条件满足,在指定位置设置断点。
break line thread thread-number 在指定的线程中中断。使用info threads可以显示线程号。
tbreak 设置临时的断点。中断一次后断点会被删除。
watch condition 当条件满足时设置观察点。
clear
clear func
clear nth 清除函数func处的断点。
清除第nth行处的断点。
delete
d 删除所有的断点或观察点。
delete breakpoint-number
delete range 删除指定的断点,观察点。
disable breakpoint-number-or-range
enable breakpoint-number-or-range 不删除断点,仅仅把它设置为无效,或有效。
例子:
显示断点: info break
设置无效: disable 2-9
enable once breakpoint-number 设置指定断点有效,当到达断点时置为无效。
enable del breakpoint-number 设置指定断点有效,当到达断点时删除它。
finish 继续执行到函数结束。
Line Execution 
 
step
s
step number-of-steps-to-perform 进入下一行代码的执行,会进入函数内部。
next
n
next number 执行下一行代码。但不会进入函数内部。
until
until line-number 继续运行直到到达指定行号,或者函数,地址等。
return
return expression 弹出选中的栈帧(stack frame)。如果后面指定参数,则返回表达式的值。
stepi
si
nexti
ni 执行下一条汇编/CPU指令。
info signals
info handle
handle SIGNAL-NAME option 当收到信号时执行下列动作:nostop(不要停止程序),stop(停止程序执行),print(显示信号),noprint(不显示),pass/noignore(允许程序处理信号),nopass/ignore(不让程序接受信号)
where 显示当前的行号和所处的函数。
Program Stack 
 
backtrace
bt
bt inner-function-nesting-depth
bt -outer-function-nesting-depth 显示当前堆栈的追踪,当前所在的函数。
backtrace full 打印所有局部变量的值。
frame number
f number 选择指定的栈帧。
up number
down number 向上或向下移动指定个数的栈帧。
info frame addr 描述选中的栈帧。
info args
info all-reg
info locals
info catch 显示选中栈帧的参数,局部变量,异常处理函数。all-reg也会列出浮点寄存器。
Source Code 
 
list
l
list line-number
list function
list -
list start#,end#
list filename:function 列出相应的源代码。
set listsize count
show listsize 设置list命令打印源代码时的行数。
directory directory-name
dir directory-name
show directories 在源代码路径前添加指定的目录。
directory 当后面没有参数时,清除源代码目录。
Examine Variables 
 
print variable
p variable
p file::variable
p ‘file‘::variable 打印指定变量的值。
p *[email protected] 打印arrary-var中的前length项。
p/x var 以十六进制打印整数变量var。
p/d var 把变量var当作有符号整数打印。
p/u var 把变量var作为无符号整数打印。
p/o var 把变量var作为八进制数打印。
p/t var
x/b address
x/b &variable 以整数二进制的形式打印var变量的值。
p/c variable 当字符打印。
p/f variable 以浮点数格式打印变量var。
p/a variable 打印十六进制形式的地址。
x/w address
x/4b &variable 打印指定的地址,以四字节一组的方式。
call expression  类似于print,但不打印 void 。
disassem addr 对指定地址中的指令进行反汇编。
Controlling GDB 
 
set gdb-option value 设置 GDB 的选项。
set print array on
set print array off
show print array 以可读形式打印数组。默认是 off 。
set print array-indexes on
set print array-indexes off
show print array-indexes 打印数组元素的下标。默认是 off 。
set print pretty on
set print pretty off
show print pretty 格式化打印 C 结构体的输出。
set print union on
set print union off
show print union 打印 C 中的联合体。默认是 on 。
set print demangle on
set print demangle off
show print demangle 控制 C++ 中名字的打印。默认是 on 。
Working Files
 
info files
info share 列出当前的文件,共享库。
file file 把file当作调试的程序。如果没指定参数,丢弃。
core file 把file当作 core 文件。如果没指定参数,则丢弃。
exec file 把file当作执行程序。如果没指定参数,则丢弃。
symbol file 从file中读取符号表。如果没指定参数,则丢弃。
load file 动态链入file文件,并读取它的符号表。
path directory 把目录directory加入到搜索可执行文件和符号文件的路径中。
Start and Stop 
 
run
r
run command-line-arguments
run < infile > outfile 从头开始执行程序,也允许进行重定向。
continue
c 继续执行直到下一个断点或观察点。
continue number 继续执行,但会忽略当前的断点number次。当断点在循环中时非常有用。
kill 停止程序执行。
quit
q 退出 GDB 调试器。

GDB 操作提示

在编译可执行文件时需要给 gcc 加上 "-g" 选项,这样它才会为生成的可执行文件加入额外的调试信息。
不要使用编译器的优化选项,比如: "-O","-O2"。因为编译器会为了优化而改变程序流程,那样不利于调试。
在 GDB 中执行 shell 命令可以使用:shell command
GDB 命令可以使用 TAB 键来补全。按两次 TAB 键可以看到所有可能的匹配。
GDB 命令缩写:例如 info bre 中的 bre 相当于 breakpoints。
GDB 在 Emacs 中的操作:
emacs 按键 动作
M-x gdb  切换到 gdb 模式。
C-h m  显示 gdb 模式介绍信息。
M-s  等同于gdb 中的 step 命令。
M-n  等同于gdb 中的 next 命令。
M-i  等同于gdb 中的 stepi 命令。
C-c C-f  等同于gdb 中的 finish 命令。
M-c  等同于gdb 中的 continue 命令。
M-u  等同于gdb 中的 up 命令。
M-d  等同于gdb 中的 down 命令。

x/20x &login_request

时间: 2024-08-26 12:40:41

程序调试命令gdb的相关文章

linux程序调试命令strace

strace命令用法详解: strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备.strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间. strace常用参数: -p 跟踪指定的进程 -f 跟踪由fork子进程系统调用 -F 尝试跟踪vfork子进程系统调吸入,与-f同时出现时, vfork不被跟踪

gdb调试命令

本篇摘自互联网,纯属自己学习笔记,然分享给看到我的博客的人们. 用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能.而Windows下的图形软件基本上是各自为营,

Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)

在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试.本文主要介绍调试C/C++在Linux操作系统下主要的调试工具. 在Linux下写程序,C/C++主要的编译器有GCC/G++,ICC等,像我等穷码农,最喜欢GCC了,很大原因是他免费!所以,我们以GCC/G++为例介绍主要的调试工具. 分以下几个内容介绍: 1.调试之前的工作 2.选择调试工具 3.调试步骤 点我,请帮我投一票! 调试之前的工作 编译器在编译阶段需要产生可供调试的代码,才能被

Linux下C++的编程——GDB进行程序调试

GDB简介 我们在Linux下C++的编程--开偏介绍一文中已经简单介绍了GDB的功能,是类Unix系统的主要调试工具,可进行断点调试,跟踪程序,动态改变执行环境等功能. 从一个程序开始调试 下面我们就从一个程序开始讲解一下GDB的简单用法.假设我们有如下的程序: GDBTest1.cpp #include <iostream> int Accumulation(int n) { int result = 0; for(int i = 0; i < n; i ++) { result +

1、GDB程序调试

GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具.一般来说GDB主要完成下面四个部分的功能. 1)启动你的程序,可以按照你的自定义的要求运行程序. 2)可让被调试程序在你所指定的调试的断点处停住(断点可以使条件表达式). 3)当程序被停住时.可以检查此时你的程序中所发生的事,包括查看当前状态下程序中指定变量的值. 4)动态的改变你程序的执行环境. 步骤: 1.先使用vi编辑器编辑文件test.c,用于GDB调试器调试. 2.使用命令gcc -g test.c -o test,编译

gdb对应vc调试命令

gdb vc调试对照表: 实现功能                vc                   gdb 修改后编译              f7                   make 跳出函数(step out)    shift+f11            finish,f 重新启动                ctrl+shift+f5        run,r 运行到指定行            f9+f5                tbreak,tb + c

GDB常用调试命令

在程序编译时增加-g选项以支持gdb调试 如: $ gcc -g example.c -o example.x 通过上述命令对example.c编译之后,使用下列命令进入到gdb调试: $ gdb example.x 在gdb调试中,常用的命令有以下几个: $ list 缩略为 l 列出程序源码,每次列出10行,按回车重复运行上一命令: $ run 缩略为 r 程序开始运行,在r后可以加入程序启动参数,程序运行到断点处暂停: $ continue 缩略为 c 程序继续运行,到下一断点处暂停: 单

GDB调试命令小结

1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方式gdb program core //用gdb查看core dump文件,跟踪程序core的原因gdb program pid //用gdb调试已经开始运行的程序,指定pid即可gdb attach pid //用gdb调试已经开始运行的程序,指定pid即可 2.调试命令(1)执行命令模式-bat

比较全面的gdb调试命令

用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能.而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成.在这里并不是要和Win