linux下gdb单步调试(中)
Linux下用gdb调试、查看代码堆栈
Linux下⽤gdb调试、查看代码堆栈Linux中⽤gdb 查看代码堆栈的信息core dump ⼀般是在segmentation fault(段错误)的情况下产⽣的⽂件,需要通过ulimit来设置才会得到的。
调试的话输⼊: gdb filename corefilename就是产⽣core⽂件的可执⾏⽂件,core就是产⽣的dump⽂件查看栈信息—————当程序被停住了,你需要做的第⼀件事就是查看程序是在哪⾥停住的。
当你的程序调⽤了⼀个函数,函数的地址,函数参数,函数内的局部变量都会被压⼊“栈”(Stack)中。
你可以⽤GDB命令来查看当前的栈中的信息。
下⾯是⼀些查看函数调⽤栈信息的GDB命令:backtracebt打印当前的函数调⽤栈的所有信息。
如:(gdb) bt#0 func (n=250) at tst.c:6#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30#2 0x400409ed in __libc_start_main () from /lib/libc.so.6从上可以看出函数的调⽤栈信息:__libc_start_main --> main()--> func()backtracebtn是⼀个正整数,表⽰只打印栈顶上n层的栈信息。
backtrace <-n>bt <-n>-n表⼀个负整数,表⽰只打印栈底下n层的栈信息。
如果你要查看某⼀层的信息,你需要在切换当前的栈,⼀般来说,程序停⽌时,最顶层的栈就是当前栈,如果你要查看栈下⾯层的详细信息,⾸先要做的是切换当前栈。
framefn是⼀个从0开始的整数,是栈中的层编号。
⽐如:frame 0,表⽰栈顶,frame 1,表⽰栈的第⼆层。
up表⽰向栈的上⾯移动n层,可以不打n,表⽰向上移动⼀层。
down表⽰向栈的下⾯移动n层,可以不打n,表⽰向下移动⼀层。
Linux操作系统下的C语言开发环境搭建测试题
Linux操作系统下的C语言开发环境搭建测试题(答案见尾页)一、选择题1. Linux操作系统下,C语言开发环境的搭建需要以下哪些步骤?A. 安装GCC编译器B. 设置环境变量C. 编译和运行C程序D. 配置终端2. 在Linux操作系统中,以下哪个命令可以用来编译和运行C程序?A. gccB. g++C. chmodD. make3. 在Linux操作系统中,如何修改默认的编译器路径?A. 修改PATH环境变量B. 使用export命令C. 编辑/etc/profile文件D. 修改gcc的配置文件4. 在Linux操作系统中,安装了GCC编译器后,如何验证其安装成功?A. 输入gcc --version命令B. 输入gcc -v命令C. 输入gcc --configure命令D. 输入gcc -E命令5. 在Linux操作系统中,如何配置终端以方便进行C语言编程?A. 更改终端的提示符B. 安装tmux或screen工具C. 配置bashrc文件6. 在Linux操作系统中,如何使用GDB调试器调试C程序?A. 安装gdb软件包B. 编译程序时添加-g选项C. 使用gdb命令启动程序D. 查看程序内存布局7. 在Linux操作系统中,如何查看源代码文件的内容?A. 使用cat命令B. 使用less命令C. 使用grep命令D. 使用find命令8. 在Linux操作系统中,如何使用vi编辑器编辑C语言源代码文件?A. 进入vi编辑器B. 编辑文件内容C. 保存文件并退出vi编辑器D. 检查文件是否已保存9. 在Linux操作系统中,如何通过FTP上传和下载文件?A. 使用ftp命令B. 使用sftp命令C. 使用scp命令D. 使用ls命令10. 在Linux操作系统中,如何设置用户权限以确保C语言源代码的安全?A. 使用chmod命令B. 使用chown命令C. 使用umask命令D. 使用acl命令11. Linux操作系统下,C语言开发环境的搭建需要以下哪些步骤?B. 设置环境变量C. 配置编译选项D. 编译和运行C程序12. 在Linux系统下,如何修改一个文件的权限使其可读可写?A. chmod 666 filenameB. chmod 777 filenameC. chmod 644 filenameD. chmod 755 filename13. 在Linux系统下,使用以下哪个命令可以查看文件的详细信息,如文件大小、创建日期等?A. ls -lB. df -hC. tar -xvf file.tarD. stat filename14. 在Linux系统下,如何使用vi编辑器打开一个文件?A. vi filenameB. vim filenameC. nano filenameD. emacs filename15. 在Linux系统下,安装了GCC编译器后,如何验证其是否正确安装?A. echo $PATHB. which gccC. gcc --versionD. all of the above16. 在Linux系统下,如何创建一个新的目录并进入该目录?A. mkdir new_directoryB. cd new_directoryC. rmdir new_directoryD. mkdir -p new_directory17. 在Linux系统下,如何使用grep命令在文本中搜索特定的字符串?A. grep "search_string" filenameB. grep "search_string" filename | lessC. grep "search_string" filename | moreD. all of the above18. 在Linux系统下,如何修改一个文件的换行符为LF(Unix风格)?A. dos2unix filenameB. unix2dos filenameC. cat filename | tr '' '' > filenameD. all of the above19. 在Linux系统下,如何使用find命令查找特定文件?A. find / -name "filename_pattern"B. find . -type f -name "filename_pattern"C. find / -name "filename_pattern" -printD. all of the above20. Linux操作系统下,C语言开发环境的搭建需要以下哪些步骤?A. 安装编译器B. 配置编译环境变量C. 安装文本编辑器D. 编写、编译和运行C源代码21. 在Linux操作系统下,以下哪个命令可以用来编译和运行C语言源代码?A. gccB. g++C. chmodD. make22. 在Linux操作系统下,以下哪个命令可以用来安装一个新的C语言库?A. apt-getB. yumC. pacman23. 在Linux操作系统下,以下哪个命令可以用来查看源代码的层次结构?A. catB. grepC. treeD. less24. 在Linux操作系统下,以下哪个命令可以用来创建一个新目录?A. mkdirB. rmdirC. touchD. cp25. 在Linux操作系统下,以下哪个命令可以用来删除一个文件?A. rmB. mvC. rmdirD. cp26. 在Linux操作系统下,以下哪个命令可以用来复制文件或目录?A. cpB. mvC. rmD. ln27. 在Linux操作系统下,以下哪个命令可以用来查看文件的内容?A. catB. grepC. lessD. head28. 在Linux操作系统下,以下哪个命令可以用来查找文件?A. findB. locateD. man29. 在Linux操作系统下,以下哪个命令可以用来查看当前目录的内容?A. lsB. cdC. pwdD. man30. Linux操作系统下,C语言开发环境的搭建需要哪些步骤?A. 安装GCC编译器B. 配置内核头文件C. 安装文本编辑器D. 配置终端环境31. 在Linux操作系统下,如何验证C语言编译成功?A. 编译一个简单的C源代码,观察是否有语法错误B. 使用命令行进入编译后的目录,查看生成的可执行文件C. 在终端中输入编译命令,观察是否有错误信息D. 将编译后的程序在另一个系统中运行,检查功能是否实现32. Linux操作系统下,C语言开发常用的文本编辑器有哪些?A. VimB. EmacsC. nanoD. Kate33. 在Linux操作系统下,如何配置终端环境以便于C语言编程?A. 设置默认编码为UTF-8B. 配置PATH环境变量,确保编译器路径已添加C. 安装并配置版本控制工具(如Git)D. 配置别名,提高编程效率34. 在Linux操作系统下,C语言开发中常用的调试工具有哪些?A. GDB调试器B. DDD调试工具C. Valgrind内存检测工具D. printf()函数调试35. Linux操作系统下,C语言开发环境的搭建过程中,如何配置网络连接?A. 修改网络配置文件,设置静态IP地址B. 关闭防火墙,确保端口畅通C. 配置DNS服务器,解析域名D. 使用Wireshark工具监控网络流量36. 在Linux操作系统下,C语言开发环境中,如何管理项目文件?A. 使用版本控制工具(如Git)进行项目管理B. 使用文件系统树形结构管理项目文件C. 使用目录和文件名来管理项目文件D. 使用标签系统管理项目文件37. Linux操作系统下,C语言开发环境的搭建完成后,如何优化编译速度?A. 升级GCC编译器到最新版本B. 优化编译选项,减少编译时间C. 使用增量编译,避免重复编译D. 使用并行编译,提高编译速度38. 在Linux操作系统下,C语言开发环境的搭建过程中,如何安装必要的库文件?A. 使用包管理器(如apt或yum)安装库文件B. 从官方网站下载库文件并手动安装C. 从源代码编译库文件并安装D. 使用静态链接库文件,减少动态链接的内存开销39. Linux操作系统下,C语言开发环境的搭建完成后,如何进行代码测试和调试?A. 使用GDB调试器进行单步调试B. 使用DDD调试工具查看内存状态C. 使用printf()函数打印变量值进行调试D. 使用单元测试框架进行自动化测试40. Linux操作系统下,C语言开发环境的搭建需要以下哪些步骤?A. 安装GCC编译器B. 配置环境变量C. 安装文本编辑器D. 编译和运行C程序41. 在Linux操作系统下,以下哪个命令可以用来查看系统中的所有进程?A. ps -efB. topC. freeD. all42. 在Linux操作系统下,如何修改一个文件的权限使得文件所有者具有读写权限,其他用户只具有读权限?A. chmod 644 filenameB. chmod 755 filenameC. chmod 664 filenameD. chmod 777 filename43. 在Linux操作系统下,使用以下哪个命令可以查看当前目录下的隐藏文件?A. ls -aB. ls -lC. ls -hD. ls -d44. 在Linux操作系统下,如何安装一个新软件包?A. apt-get updateB. yum install package_nameC. pacman -S package_nameD. brew install package_name45. 在Linux操作系统下,如何使用grep命令查找包含特定字符串的文件?A. grep "search_string" filenameB. grep "search_string" /path/to/filenameC. grep "search_string" $(find /path/to/search -type f)D. grep "search_string" /path/to/search/*46. 在Linux操作系统下,如何修改文件的所有者和组?A. chown new_owner:new_group filenameB. chown new_owner:new_group /C. chown new_owner:new_group *D. chown new_owner:new_group .47. 在Linux操作系统下,如何创建一个新的用户组?A. groupadd group_nameB. groupadd -g GID group_nameC. groupadd -G GID group_nameD. groupadd -p group_name48. 在Linux操作系统下,如何设置Shell提示符?A. export PS1="\u@\h:\w\$ "B. export PS1="\u@\h:\w\$ "C. export PS1="\u@\h:\w\\$ "D. export PS1="\u@\h:\w\$ "二、问答题1. 请简述在Linux操作系统下搭建C语言开发环境的步骤。
linux下gdb单步调试
linux下gdb单步调试(上)2008-12-06 21:12用 GDB 调试程序GDB 概述————GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。
或许,各位比较喜欢那种图形界面方式的,像 VC 、 BCB 等 IDE 的调试,但如果你是在UNIX 平台下做软件,你会发现 GDB 这个调试工具有比 VC 、 BCB 的图形化调试器更强大的功能。
所谓“ 寸有所长,尺有所短” 就是这个道理。
一般来说, GDB 主要帮忙你完成下面四个方面的功能:1 、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2 、可让被调试的程序在你所指定的调置的断点处停住。
(断点可以是条件表达式)3 、当程序被停住时,可以检查此时你的程序中所发生的事。
4 、动态的改变你程序的执行环境。
从上面看来, GDB 和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现 GDB 这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。
让我们一一看来。
一个调试示例——————源程序: tst.c1 #include <stdio.h>23 int func(int n)4 {5 int sum=0,i;6 for(i=0; i<n; i++)7 {8 sum+=i;9 }10 return sum;11 }121315 {16 int i;17 long result = 0;18 for(i=1; i<=100; i++)19 {20 result += i;21 }2223 printf("result[1-100] = %d \n", result );24 printf("result[1-250] = %d \n", func(250) );25 }编译生成执行文件:( Linux 下)hchen/test> cc -g tst.c -o tst使用 GDB 调试:hchen/test> gdb tst <---------- 启动 GDBGNU gdb 5.1.1Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-suse-linux"...(gdb) l <-------------------- l 命令相当于 list ,从第一行开始例出原码。
gdb 调试函数
gdb 调试函数
要调试一个函数,你需要以下步骤:1. 使用`gdb` 命令行工具启动你的程序:`gdb <executable>`,其中`<executable>` 是你要调试的可执行文件。
2. 设置断点:使用`break` 命令在你要调试的函数的位置设置断点。
例如,如果你要调试的函数是`my_function()`,可以使用`break my_function` 来设置断点。
3. 启动程序:使用`run` 命令启动程序,然后程序将在断点处停止执行。
4. 执行程序:使用`next` 命令按行执行代码,或使用`step` 命令进入函数内部执行。
5. 在调试过程中查看变量的值:使用`print` 命令来查看变量的值。
例如,可以使用`print variable_name` 来查看变量`variable_name` 的值。
6. 继续执行程序:使用`continue` 命令继续执行程序,直到下一个断点或程序结束。
7. 在调试结束后退出`gdb`:使用`quit` 命令退出`gdb`。
这些是基本的
`gdb` 调试函数的使用方法。
你还可以使用其他命令来查看堆栈信息、设置条件断点、跳到指定行等。
可以使用`help` 命令来获取更多有关`gdb` 命令的信息。
Linux应用调试使用gdb和gdbserver命令详解
Linux应⽤调试使⽤gdb和gdbserver命令详解1.gdb和gdbserver调试原理通过linux虚拟机⾥的gdb,来向开发板⾥的gdbserver发送命令,⽐如设置断点,运⾏setp等,然后开发板上的gdbserver收到命令后,便会执⾏应⽤程序做相应的动作,来实现调试的功能和之前学的裸板GDB调试⼀样,只不过之前学的是在win下的,本次是在linux⾥的gdb1.1同样,它们都会需要⼀个带调试信息的编译⽂件.通过Makefile⾥的arm-linux-gcc -g 来的, -g:表⽰编译⽂件⾥包含gdb调试信息1.2为什么需要调试信息的编译⽂件?⽐如读开发板的应⽤程序⾥的变量a:⾸先gdb通过应⽤程序的带调试信息的编译⽂件,来找出变量a存的地址位置然后将地址发送给开发板⾥的gdbserver,来读出a地址的值2.安装gdb和gdbserver2.1在虚拟机上安装GDB: # tar xjf gdb-7.4.tar.bz2 //解压# cd gdb-7.4/ //进⼊gdb-7.4⽬录#./configure --target=arm-linux//GDB需要在pc本机⾥运⾏,并调试开发板⾥的应⽤程序,所以--target设为arm-linux#make //编译#mkdir tmp#make install prefix=$PWD/tmp //安装到./tmp⽬录下sudo cp tmp/bin/arm-linux-gdb /bin/ //复制到/bin⽬录下/bin/arm-linux-gdb -v //-v: 确定⼀下gdb的版本VID,是否是7.42.2 在开发板上安装GDBServer:cd gdb/gdbserver/ //在gdb-7.4⽬录下输⼊./configure --target=arm-linux --host=arm-linux //设GDBServer的⼯作环境make //编译出现以下错误:指在linux-arm-low.c⾥,没有找到PTRACE_GETSIGINFO 定义2.3 解决:1)#echo $PATH //来查看PATH环境变量找到编译器gcc位于/work/tools/gcc-3.4.5-glibc-2.3.6/bin2)#cd /work/tools/gcc-3.4.5-glibc-2.3.6/ # grep "PTRACE_GETSIGINFO" * -nR在gcc根⽬录下,搜索到在linux/ptrace.h中定义:3)#vi linux-arm-low.c添加: #define PTRACE_GETSIGINFO 0x42024)最后重新make,⽣成gdbserver命令⽂件然后将gdbserver命令⽂件,放⼊我们开发板的根⽬录/bin中,便能使⽤了cp gdbserver /nfs_root/bin/ //nfs_root:开发板的nfs系统根⽬录3.测试程序如下(test_debug.c)#include <stdio.h>void C(int *p){ *p = 0x12;}void B(int *p){ C(p);}void A(int *p){ B(p);}void A2(int *p){ C(p);}int main(int argc, char **argv){ int a; int *p = NULL; A2(&a); // A2 > C printf("a = 0x%x\n", a); A(p); // A > B > C return 0;}其中A2(&a)会调⽤A2()->C(),然后将a赋值为0x12.A(p)会调⽤A()->B()->C(),由于p是个空指针,这⾥将会出错.接下来,我们便以这个应⽤程序为例.4.编译#arm-linux-gcc -g -o test_debug test_debug.c //-g:附带调试信息5.调试test_debug.c在开发板上:⾸先,需要让gdbserver建⽴本地服务器,以及要测试的哪个⽂件:#gdbserver 192.168.2.107:2345 ./test_debug//192.168.2.107:本地IP地址//2345:端⼝号,⽤来让gdb来连接⽤的//./test_debug:要测试的哪个⽂件在虚拟机上:#/bin/arm-linux-gdb ./test_debug // 启动gdb,指定调试⽂件为test_debug#target remote 192.168.2.107:2345 //与gdbserver建⽴连接5.1连接成功,便使⽤gdb命令来调试列出所有源代码break [file]:[row]打断点,⽐如:break test_debug.c:21 //在test_debug.c⽂件的第21⾏处打断点info br查看断点info file列出当前的⽂件,共享库。
(2021年整理)GDB调试命令手册.
(完整版)GDB调试命令手册.编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整版)GDB调试命令手册.)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整版)GDB调试命令手册.的全部内容。
(完整版)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 退出 gdbreverse-search 在源文件中反向搜索正规表达式run 执行该程序search 在源文件中搜索正规表达式set variable 给变量赋值signal 将一个信号发送到正在运行的进程step 执行下一个源程序行,必要时进入下一个函数undisplay display 命令的反命令,不要显示表达式until 结束当前循环up 上移栈帧,使另一函数成为当前函数watch 在程序中设置一个监测点(即数据断点whatis 显示变量或函数类型GDB 命令分类详解一:列文件清单。
如何在Linux终端中调试程序
如何在Linux终端中调试程序在Linux系统中,终端是开发者和系统管理员经常使用的重要工具。
通过终端,我们可以执行各种命令和操作,包括程序的编译、运行和调试。
本文将介绍在Linux终端中如何进行程序调试的方法和技巧。
一、安装调试工具要在Linux终端中进行程序调试,首先需要安装相应的调试工具。
常用的调试工具包括GDB (GNU调试器)和LLDB (LLVM调试器)。
这两个工具都是开源的,可以通过包管理器来安装。
1. 使用GDB进行程序调试GDB是Linux中最常用的调试工具之一。
下面是GDB的安装方法:```$ sudo apt-get install gdb```安装完成后,可以通过以下命令来验证安装是否成功:```$ gdb --version```2. 使用LLDB进行程序调试LLDB是一个高级的调试工具,它可以用于多种编程语言,包括C、C++和Objective-C。
下面是LLDB的安装方法:```$ sudo apt-get install lldb```安装完成后,可以通过以下命令来验证安装是否成功:```$ lldb --version```二、编译程序时的调试选项在Linux终端中调试程序时,为了方便跟踪问题和定位错误,可以在编译程序时添加调试选项。
常用的调试选项包括-g(生成调试信息)、-Wall(显示警告信息)和-O0(禁用优化)。
例如,使用gcc编译C程序时可以使用以下命令:```$ gcc -g -Wall -O0 program.c -o program```三、使用GDB进行程序调试1. 启动GDB调试器通过以下命令启动GDB调试器,并加载需要调试的程序:```$ gdb program```2. 设置断点在GDB中,可以使用break命令设置断点,以便在程序执行到指定位置时暂停。
例如,要在函数的第10行设置断点,可以使用以下命令:```(gdb) break 10```3. 执行程序使用run命令执行程序,并在断点处停止:```(gdb) run```4. 调试程序一旦程序在断点处停止,可以使用以下命令进行调试:- 继续执行:使用continue命令继续执行程序。
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 退出gdbreverse-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命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。
GDB使用手册(中文版)
GDB 4.16, Copyright 1995 Free Software Foundation, Inc... (gdb) (gdb)是提示符,在这提示符下可以输入命令,直到退出。(退出命令是 q/Q) 为了尽量和原文档说明的命令相符,即使在本例子中没用的命令我也将演示。
首先我们可以设置 gdb 的屏幕大小。键入: (gdb)set width 70
* 数据:
检查数据
* 语言:
用不同的语言来使用 GDB
* 符号:
检查符号表
* 更改:
更改执行
* GDB 的文件
文件
* 对象 * 控制 GDB * 执行序列: * Emacs: * GDB 的 bug: * 命令行编辑: * 使用历史记录交互: * 格式化文档: * 安装 GDB :
指定调试对象 控制
执行一序列命令 使 GDB 和 Emacs 一起工作
行编辑
如何格式化和打印 GDB 文档
* 索引:
GDB 简介: **************
调试器(比如象 GDB)能让你观察另一个程序在执行时的内部活动,或程序出错时 发生了什么。
GDB 主要能为你做四件事(包括为了完成这些事而附加的功能),帮助你找出程序 中的错误。
Richard Stallman 是 GDB 的始作俑者,另外还有许多别的 GNU 的成员。许多人
为此作出了贡献。(都是老外不提也罢,但愿他们不要来找我麻烦:-))
这里是 GDB 的一个例子: 原文中是使用一个叫 m4 的程序。但很遗憾我找不到这个程序的原代码,
所以没有办法来按照原文来说明。不过反正是个例子,我就拿一个操作系统的 进程调度原码来说明把,原代码我会附在后面。
Fundamentally, the General Public License is a license which says that you have these freedoms and that you cannot take these freedoms away from anyone else. GDB 的作者:
Qt Linux上gdbserver调试
Data:2015/12/7
Author:robin luo
Qt linux gdbserver 调试----采用Qt调试Linux桌面程序
1.首先安装必要的Linux版本gdb软件(必须用交叉编译器编译)
参考:/s/blog_a6149ba101017u1b.html
2.采用SSH下载编译的gdbserver文件或采用nfs挂载,在开发板上输入一下命令:假设:PC端 10.3.2.175 开发板 10.3.2.99
开发板输入:gdbserver 10.3.2.175:10000 tDemo –qws
其中tDemo为arm端 qt软件
如下图:
3.在Linux端的Qt设置 tools->option
说明:按照上面的步骤点击其中主机名称:为开发板的ip地址,用户名root(根据具体的情况设置),设置完成后就可以点击测试,如下:
4.仿真是设置 debug如下:
重点说明:
服务器端口:必须和开发板上设置的一致图中为10000(范围10000--10100)本地执行挡:是交叉编译生成后的目标文件
工作目录:工程路径
在终端运行:必须要勾选,亲自测试
5.编译设置
其中调试器选择:生成的arm端gdb调试器
6 . 最后的仿真结果
Reference
/Article/DaVinci/TMS320DM81x/201305/48461.html。
c语言单步调试的步骤
C语言单步调试步骤单步调试是程序员在开发过程中常用的调试方法,它可以帮助我们逐步执行代码,检查每一步的结果,从而找出问题所在并进行修复。
下面是C语言单步调试的一般步骤:1. 编译代码在使用调试器之前,首先需要将代码编译成可执行文件。
在终端或IDE中输入编译命令,将源代码编译成可执行文件。
例如,使用gcc编译器编译C语言源代码:```bashgcc -o program program.c```2. 启动调试器调试器是一种用于单步执行程序的工具,它可以让我们观察程序在每一步执行时的状态。
在Linux系统中,常用的调试器有gdb和lldb等。
启动调试器并加载可执行文件:```gdb program```3. 设置断点断点是用于暂停程序执行的位置。
在调试过程中,我们通常在程序的关键位置设置断点,以便观察变量值和程序状态。
在调试器中设置断点:```phpbreak main```上述命令将在main函数处设置断点。
我们可以根据需要设置多个断点。
4. 开始调试在设置好断点后,使用调试器的“run”命令开始执行程序:run```程序将执行直到遇到断点并暂停。
5. 检查变量当程序在断点处暂停时,我们可以检查变量的值和程序状态。
在gdb中查看变量值:```phpprint variable_name```可以使用上述命令查看变量值。
我们还可以使用其他调试命令来检查程序状态。
6. 单步执行使用调试器的“step”命令单步执行程序:step```如果遇到函数调用,使用“next”命令逐行执行函数:```arduinonext```7. 观察输出在调试过程中,我们可以观察程序的输出以了解程序的执行情况。
在终端中查看输出:```bashprogram arg1 arg2 ...```8. 修复错误根据调试过程中的观察和检查,我们可以找到并修复代码中的错误。
修复错误后,重新编译并启动调试器进行测试。
9. 重复调试重复执行上述步骤,直到程序能够正确执行并完成预期结果。
linux系统调试工具GDB 命令详细解释..
Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具。
和所有常用的调试工具一样,gdb提供了以下功能:# 监视程序中变量的值# 在程序中设置断点# 程序的单步执行在使用gdb前,必须先载入可执行文件,因为要进行调试,文件中就必须包含调试信息,所以在用gcc或cc编译时就需要用-g参数来打开程序的调试选项。
调试开始时,必须先载入要进行调试的程序,可以用以下两种方式:* 在启动gdb后执行以下命令:file 可执行文件路径* 在gdb启动时就载入程序:gdb 可执行文件路径载入程序后,接下来就是要进行断点的设置,要监视的变量的添加等工作,下面对在这个过程中常会用到的命令逐一进行介绍:* list:显示程序中的代码,常用使用格式有:list输出从上次调用list命令开始往后的10行程序代码。
list -输出从上次调用list命令开始往前的10行程序代码。
list n输出第n行附近的10行程序代码。
list function输出函数function前后的10行程序代码。
* forward/search:从当前行向后查找匹配某个字符串的程序行。
使用格式:forward/search 字符串查找到的行号将保存在$_变量中,可以用print $_命令来查看。
* reverse-search:和forward/search相反,向前查找字符串。
使用格式同上。
* break:在程序中设置断点,当程序运行到指定行上时,会暂停执行。
使用格式:break 要设置断点的行号* tbreak:设置临时断点,在设置之后只起作用一次。
使用格式:tbreak 要设置临时断点的行号* clear:和break相反,clear用于清除断点。
使用格式:clear 要清除的断点所在的行号* run:启动程序,在run后面带上参数可以传递给正在调试的程序。
gdb编译和调试命令
编译和调试是软件开发过程中的重要步骤,尤其是在使用GDB (GNU调试器)时。
以下是一些基本的GDB编译和调试命令:1.编译:2.1.使用gcc编译器进行编译。
例如,如果你有一个名为main.c的源文件,你可以使用以下命令进行编译:复制代码`gcc -g main.c -o main`1.-g选项告诉编译器生成调试信息。
3.启动GDB并加载程序:4.1.使用GDB启动程序:复制代码`gdb ./main`5.设置断点:6.1.在函数或代码行上设置断点,以便在程序执行到该点时停止:复制代码css`break main.c:10`7.运行程序:8.1.使用run命令启动程序:复制代码`run`9.查看变量值:10.1.在程序暂停时,使用print命令查看变量的值:复制代码`print variable_name`11.步进:12.1.执行下一行代码:复制代码css`next`或`n`1.进入函数或子例程:复制代码css`step`或`s`13.跳过函数:14.1.跳过当前函数并执行下一行代码:复制代码css`finish`或`f`15.继续执行直到下一个断点:16.1.使用continue或c命令。
如果你想在到达断点之前停止程序,可以使用until命令。
17.查看调用栈:18.•使用where或简写的w命令查看调用栈。
这显示了当前位置的函数调用序列。
1.退出GDB:使用quit命令退出GDB。
也可以使用简写形式q。
2.查看源代码:在GDB中,可以使用list命令(简写为l)查看当前行的前后代码。
也可以使用文件名和行号来查看特定代码的上下文。
例如,要查看main.c文件的第10行代码,可以使用以下命令:kotlin复制代码list main.c:10。
常用GDB调试方法
常用GDB调试方法GDB(GNU调试器)是一个命令行调试工具,用于在开发和调试过程中定位和修复程序中的错误。
它具有丰富的功能,如设置断点、单步执行、查看变量和内存、跟踪程序执行流等。
下面是一些常用的GDB调试方法。
1.启动程序调试:要在GDB中调试一个程序,需要先启动GDB并加载要调试的可执行文件。
在命令行中输入“gdb [executable]”来启动GDB,并将可执行文件作为参数传递给它。
2.设置断点:断点是程序执行过程中的一个停止点,用于跟踪程序执行流和查看变量的值。
使用“break [line number]”命令在指定行上设置断点。
例如,“break main”将在程序的主函数上设置一个断点。
3.启动程序:在GDB中使用“run”命令来启动程序的执行。
程序将在遇到断点或程序结束时停止。
4.单步执行:使用“step”命令可以按照程序的执行流,在函数调用之间进行单步执行。
这将进入函数并执行函数内部的代码。
5.继续执行:使用“continue”命令可以让程序继续执行,直到遇到下一个断点或程序结束。
6.查看变量:使用“print [variable]”命令可以查看变量的值。
也可以使用“display [variable]”命令在每次停止时自动显示变量的值。
7.修改变量的值:使用“set [variable]=[value]”命令可以修改变量的值。
这在调试过程中有时很有用。
8.查看函数调用栈:使用“backtrace”命令可以查看函数调用栈。
这将显示当前函数和调用它的函数。
9.查看堆栈帧:使用“frame [n]”命令可以查看调用栈中的特定堆栈帧。
这将显示该堆栈帧中的函数和局部变量。
10.观察程序的执行流:使用“next”命令可以按照程序的执行流在语句之间执行。
这不会进入函数调用。
11.跟踪程序的执行流:使用“trace”命令可以跟踪程序的执行流。
这将显示程序执行的每一步。
12.设置条件断点:使用“break [line number] if [condition]”命令可以在满足特定条件时设置断点。
gdb调试命令的使用及总结
gdb调试命令的使用及总结gdb是一种功能强大的调试工具,用于帮助开发人员诊断和解决程序中的错误。
通过使用gdb,开发人员可以检查程序的内部状态、变量的值以及程序的执行流程,从而更好地理解程序的行为并找到问题所在。
在使用gdb进行调试时,有一些常用的命令可以帮助我们进行调试。
下面是一些常用的gdb调试命令及其使用方法的总结。
1. 启动程序:可以使用gdb命令后跟可执行程序的路径来启动程序。
例如:gdb ./program。
2. 设置断点:可以使用break命令来设置断点。
例如:break main 可以在程序的main函数处设置断点。
3. 运行程序:可以使用run命令来运行程序。
例如:run可以开始执行程序。
4. 单步执行:可以使用step命令来逐行执行程序。
例如:step可以执行当前行并进入函数。
5. 继续执行:可以使用continue命令来继续执行程序。
例如:continue可以继续执行程序直到下一个断点。
6. 打印变量的值:可以使用print命令来打印变量的值。
例如:print variable可以打印变量的值。
7. 查看函数调用栈:可以使用backtrace命令来查看函数调用栈。
例如:backtrace可以显示当前函数的调用栈。
8. 修改变量的值:可以使用set命令来修改变量的值。
例如:set variable = value可以修改变量的值。
9. 查看内存内容:可以使用x命令来查看内存的内容。
例如:x /nfu address可以以指定格式查看指定地址的内存内容。
10. 查看寄存器的值:可以使用info registers命令来查看寄存器的值。
例如:info registers可以显示当前寄存器的值。
11. 跟踪程序执行时间:可以使用set pagination off命令来关闭分页显示功能。
例如:set pagination off可以关闭分页显示。
总结:gdb是一种强大的调试工具,可以帮助开发人员定位和解决程序中的错误。
gdb跟踪调试程序的方法
gdb跟踪调试程序的方法嘿,朋友们!今天咱来聊聊 gdb 跟踪调试程序的那些事儿。
这就好比你在一个神秘的代码世界里探险,而 gdb 就是你手中的神奇魔杖!首先呢,你得把 gdb 这个小工具准备好。
就像战士上战场得有趁手的兵器一样,gdb 就是咱程序员的得力助手。
然后,当你要调试一个程序的时候,就像打开一扇通往奇妙世界的大门。
你可以用 gdb 去加载这个程序,这感觉就像是你进入了一个满是代码宝藏的洞穴。
在这个过程中,你可以设置断点。
哎呀呀,这断点可太重要啦!就好比你在代码的道路上放置了一个个小标记,当程序运行到这里的时候,就会停下来,等你去查看。
这多方便呀,就像你在路上走,突然看到一个有趣的地方,就停下来好好瞧瞧。
还有哦,你可以查看变量的值。
这就像你在这个代码世界里,能清楚地看到每个宝藏的具体模样。
你可以知道这个变量现在是什么状态,是不是符合你的预期。
当程序暂停在断点处时,你可以一步步地执行代码。
这感觉就像是你小心翼翼地在代码的小道上往前走,每一步都看得清清楚楚。
你可以看到每一行代码是怎么影响程序的运行的。
你想想,这多神奇呀!就好像你能掌控整个代码的运行过程,让它按照你的意愿来走。
如果程序出了问题,你就能像侦探一样,通过 gdb 找到问题的根源。
比如说,程序突然崩溃了,别着急,用 gdb 来跟踪呀!看看是在哪一行代码出了岔子,是哪个变量的值变得不对劲了。
这不就像是在黑暗中找到了那一丝光亮吗?而且哦,gdb 还能帮你查看函数的调用栈。
这就像是你能看到整个程序的运行轨迹,从一个函数跳到另一个函数,就像在一个复杂的迷宫中找到正确的路径。
总之呢,gdb 跟踪调试程序就像是一场刺激的冒险。
你要勇敢地面对代码世界里的各种挑战,利用好 gdb 这个神奇的工具。
所以呀,朋友们,别害怕遇到程序中的问题,拿起 gdb 这个法宝,大胆地去探索吧!让我们在代码的海洋里畅游,找到那些隐藏的宝藏,解决那些看似棘手的问题。
相信我,一旦你掌握了 gdb 跟踪调试程序的方法,你就会发现编程变得更加有趣,更加有成就感啦!。
gdb调试命令
gdb调试命令 gdb是⼀个在UNIX环境下的命令⾏调试⼯具。
如果需要使⽤gdb调试程序,请在gcc时加上-g选项。
下⾯的命令部分是简化版,⽐如使⽤l代替list等等。
1.基本命令1)进⼊GDB #gdb test test是要调试的程序,由gcc test.c -g -o test⽣成。
进⼊后提⽰符变为(gdb) 。
2)查看源码 (gdb) l 源码会进⾏⾏号提⽰。
如果需要查看在其他⽂件中定义的函数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。
或者:使⽤断点或单步运⾏,到某个函数处使⽤s进⼊这个函数。
3)设置断点 (gdb) b 6 这样会在运⾏到源码第6⾏时停⽌,可以查看变量的值、堆栈情况等;这个⾏号是gdb的⾏号。
4)查看断点处情况 (gdb) info b 可以键⼊"info b"来查看断点处情况,可以设置多个断点;5)运⾏代码 (gdb) r6)显⽰变量值 (gdb) p n 在程序暂停时,键⼊"p 变量名"(print)即可; GDB在显⽰变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引⽤标记,以后若想再次引⽤此变量,就可以直接写作"$N",⽽⽆需写冗长的变量名;7)观察变量 (gdb) watch n在某⼀循环处,往往希望能够观察⼀个变量的变化情况,这时就可以键⼊命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点;8)单步运⾏ (gdb) n9)程序继续运⾏ (gdb) c 使程序继续往下运⾏,直到再次遇到断点或程序结束;10)退出GDB (gdb) q2.断点调试命令格式 例⼦ 作⽤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 设置捕捉点来补捉程序运⾏时的⼀些事件。
最新GDB 单步调试
G D B单步调试GDB 单步调试1、首先需要用gcc(g++)对源文件进行编译生成可执行文件,并且在编译时加上选项-g,把调试信息加到目标文件中。
2、假设生成的可执行文件为test,那么gdb test可以用gdb打开test 文件,然后通过break linenum设置断点。
可以输入list查看源文件和行号,方便设置断点。
断点设置好后就可以run命令运行到断点处了。
下面是转载一、初始化输入gdb进入gdb调试环境。
或者直接输入gdb+progfile来加载文件。
注意该文件是使用gcc(或g++)编译得到的。
为了使gdb正常工作,必须使你的程序在编译时包含调试信息,编译时必须使用-g参数来。
或者进入gdb环境后,通过命令file+progfile来加载需要调试的可执行文件文件。
查看源代码:list[函数名][行数]设置程序运行参数:set args二、暂停程序gdb可以使用几种方式来暂停程序:断点,观察点,捕捉点,信号,线程停止。
当程序被暂停后,可以使用continue、next、step来继续执行程序。
continue执行到下一暂停点或程序结束。
next执行一行源代码但不进入函数内部。
step执行一行源代码而且进入函数内部。
1、设置断点:a、break+[源代码行号][源代码函数名][内存地址]b、break.if condition.可以是上述任一参数,condition条件。
例如在循环体中可以设置break.if i=100来设置循环次数。
2、设置观察点:a、watch+[变量][表达式]当变量或表达式值改变时即停住程序。
b、rwatch+[变量][表达式]当变量或表达式被读时,停住程序。
c、awatch+[变量][表达式]当变量或表达式被读或被写时,停住程序。
3、设置捕捉点:catch+event当event发生时,停住程序。
event可以是下面的内容:1)、throw一个C++抛出的异常。
嵌入式Linux下的 应用程序调试技巧
Usage: gcov [OPTION]... SOURCEFILE Print code coverage information. -h, --help Print this help, then exit -v, --version Print version number, then exit -a, --all-blocks Show information for every basic block -b, --branch-probabilities Include branch probabilities in output -c, --branch-counts Given counts of branches taken rather than percentages -n, --no-output Do not create an output file -l, --long-file-names Use long output file names for included source files -f, --function-summaries Output summaries for each function -o, --object-directory DIR|FILE Search for object files in DIR or called FILE -p, --preserve-paths Preserve all pathname components -u, --unconditional-branches Show unconditional branch counts too For bug reporting instructions, please see: <URL:/bugs.html>. For Debian GNU/Linux specific bug reporting instructions, please see: <URL:file:///usr/share/doc/gcc-4.1/README.Bugs>
linux debug backtrace用法
linuxdebugbacktrace用法在Linux系统中,调试是开发过程中非常重要的一部分。
在处理错误和异常时,backtrace是一种非常有用的工具,可以帮助我们了解程序在发生错误时的执行流程。
今天,我们就来详细了解一下Linux 中的debugbacktrace用法。
一、backtrace简介backtrace是一种用于生成程序调用堆栈的技术,可以帮助开发者找出程序中发生错误的位置。
在Linux系统中,backtrace通常是通过调用特定系统调用来实现的。
二、backtrace的用法1.使用gdbbacktrace在Linux中,我们可以使用gdb工具来生成backtrace。
首先,我们需要将程序附加到gdb中,然后使用backtrace命令来生成调用堆栈。
例如,假设我们有一个名为test的程序,其中包含一个函数foo(),该函数调用了另一个函数bar()。
如果我们想要找出foo()中发生错误的位置,可以使用以下命令:```shellgdbtestgdb>backtrace```这将会生成一个包含程序中所有函数调用的堆栈信息。
通过分析这个堆栈信息,我们可以找出发生错误的具体位置。
2.使用perf工具生成backtraceperf是Linux中的一个性能分析工具,它也可以用于生成backtrace。
与gdb不同,perf提供了更强大的性能分析功能,可以分析CPU使用情况、缓存命中率等。
要使用perf生成backtrace,需要先安装perf工具,并使用以下命令:```shellperfrecord-g./test```这将会生成一个包含程序调用堆栈的perf文件。
之后可以使用以下命令来分析perf文件:```shellperfreport```这将会显示出程序中所有函数的调用堆栈信息,帮助我们找出发生错误的具体位置。
三、注意事项在使用backtrace进行调试时,需要注意以下几点:1.backtrace只能用于调试已经发生的错误,不能用于预防错误的发生。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
六、为停止点设定运行命令
我们可以使用 GDB 提供的 command 命令来设置停止点的运行命令。也就是说,当运行的程序在被停止住时,我们可以让其自动运行一些别的命令,这很有利行自动化调试。对基于 GDB 的自动化调试是一个强大的支持。
在 C++ 中,可能会重复出现同一个名字的函数若干次(函数重载),在这种情况下, break <function> 不能告诉 GDB 要停在哪个函数的入口。当然,你可以使用 break <function(type)> 也就是把函数的参数类型告诉 GDB ,以指定一个函数。否则的话, GDB 会给你列出一个断点菜单供你选择你所需要的断点。你只要输入你菜单列表中的编号就可以了。如:
watch <expr>
为表达式(变量) expr 设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch <expr>
当表达式(变量) expr 被读时,停住程序。
awatch <expr>
当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
breakpoints.
(gdb)
可见, GDB 列出了所有 after 的重载函数,你可以选一下列表编号就行了。 0 表示放弃设置断点, 1 表示所有函数都设置断点。
八、恢复程序运行和单步调试
当程序被停住了,你可以用 continue 命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用 step 或 next 命令单步跟踪程序。
end
断点设置在函数 foo 中,断点条件是 x>0 ,如果程序被断住后,也就是,一旦 x 的值在 foo 函数中大于 0 , GDB 会自动打印出 x 的值,并继续运行程序。
如果你要清除断点上的命令序列,那么只要简单的执行一下 commands 命令,并直接在打个 end 就行了。
七、断点菜单
condition <bnum> <expression>
修改断点号为 bnum 的停止条件为 expression 。
condition <bnum>
清除断点号为 bnum 的停止条件。
还有一个比较特殊的维护命令 ignore ,你可以指定程序运行时,忽略停止条件几次。
ignore <bnum> <count>
until 或 u
当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
stepi 或 si
nexti 或 ni
单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成, stepi 和 nexti 可以单步执行机器指令。与之一样有相同功能的命令是 “ display/i $pc ” ,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)
disable [breakpoints] [range...]
disable 所指定的停止点, breakpoints 为停止点号。如果什么都不指定,表示 disable 所有的停止点。简写命令是 dis.
enable [breakpoints] [range...]
enable 所指定的停止点, breakpoints 为停止点号。
删除指定的断点, breakpoints 为断点号。如果不指定断点号,则表示删除所有的断点。 range 表示断点号的范围(如: 3-7 )。其简写命令为 d 。
比删除更好的一种方法是 disable 停止点, disable 了的停止点, GDB 不会删除,当你还需要时, enable 即可,就好像回收站一样。
break <linenum>
在指定行号停住。
break +offset
break -offset
在当前行号的前面或后面的 offset 行停住。 offiset 为自然数。
break filename:linenum
在源文件 filename 的 linenum 行处停住。
break filename:function
enable [breakpoints] once range...
enable 所指定的停止点一次,当程序停止后,该停止点马上被 GDB 自动 disable 。
enable [breakpoints] delete range...
enable 所指定的停止点一次,当程序停止后,该停止点马上被 GDB 自动删除。
linux下gdb单步调试(中)
一、设置断点( BreakPoint )
我们用 break 命令来设置断点。正面有几点设置断点的方法:
break <function>
在进入指定函数时停住。 C++ 中可以使用 class::function 或 function(type,type) 格式来指定函数名。
Breakpoint 2 at 0xb344: file , line 875.
Breakpoint 3 at 0xafcc: file , line 846.
Multiple breakpoints were set.
Use the "delete" command to delete unwanted
2 、 catch 一个 C++ 捕捉到的异常。( catch 为关键字)
3 、 exec 调用系统调用 exec 时。( exec 为关键字,目前此功能只在 HP-UX 下有用)
4 、 fork 调用系统调用 fork 时。( fork 为关键字,目前此功能只在 HP-UX 下有用)
5 、 vfork 调用系统调用 vfork 时。( vfork 为关键字,目前此功能只在 HP-UX 下有用)
查看断点时,可使用 info 命令,如下所示:(注: n 表示断点号)
info breakpoints [n]
info break [n]
二、设置观察点( WatchPoint )
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:
只设置一次捕捉点,当程序停住以后,应点被自动删除。
四、维护停止点
上面说了如何设置程序的停止点, GDB 中的停止点也就是上述的三类。在 GDB 中,如果你觉得已定义好的停止点没有用了,你可以使用 delete 、 clear 、 disable 、 enable 这几个命令来进行维护。
clear
列出当前所设置了的所有观察点。
三、设置捕捉点( CatchPoint )
你可设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是 C++ 的异常。设置捕捉点的格式为:
catch <event>
当 event 发生时,停住程序。 event 可以是下面的内容:
1 、 throw 一个 C++ 抛出的异常。( throw 为关键字)
6 、 load 或 load <libname> 载入共享库(动态链接库)时。( load 为关键字,目前此功能只在 HP-UX 下有用)
7 、 unload 或 unload <libname> 卸载共享库(动态链接库)时。( unload 为关键字,目前此功能只在 HP-UX 下有用)
tcatch <event>
九、信号( Signals )
信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是 UNIX ,比较重要应用程序一般都会处理信号。 UNIX 定义了许多信号,比如 SIGINT 表示中断字符信号,也就是 Ctrl+C 的信号, SIGBUS 表示硬件故障的信号; SIGCHLD 表示子进程状态改变信号; SIGKILL 表示终止程序运行的信号,等等。信号量编程是 UNIX 下非常重要的一种技术。
continue [ignore-count]
c [ignore-count]
fg [ignore-count]
恢复程序运行,直到程序结束,或是下一个断点到来。 ignore-count 表示忽略其后的断点次数。 continue , c , fg 三个命令都是一样的意思。
step <count>
五、停止条件维护
前面在说到设置断点时,我们提到过可以设置一个条件,当条件成立时,程序自动停止,这是一个非常强大的功能,这里,我想专门说说这个条件的相关维护命令。 一般来说,为断点设置一个条件,我们使用 if 关键词,后面跟其断点条件。并且,条件设置好后,我们可以用 condition 命令来修改断点的条件。(只有 break 和 watch 命令支持 if , catch 目前暂不支持 if )
清除所有的已定义的停止点。
clear <function>
clear <filename:function>
清除所有设置在函数上的停止点。
clear <linenum>
clear <filename:linenum>
清除所有设置在指定行上的停止点。
delete [breakpoints] [range...]
[5] file:; line number:853
[6] file:; line number:846