用GDB调试程序(七)
———————
一、修改变量值
(gdb) print x=4
x=4这个表达式是C/C++的语法,意为把变量x的值修改为4,如果你当前调试的语言是Pascal,那么你可以使用Pascal的语法:x:=4。
在某些时候,很有可能你的变量和GDB中的参数冲突,如:
(gdb) whatis width
type = double
(gdb) p width
$4 = 13
(gdb) set width=47
Invalid syntax in expression.
(gdb) set var width=47
另外,还可能有些情况,GDB并不报告这种错误,所以保险起见,在你改变程序变量取值时,最好都使用set var格式的GDB命令。
jump <linespec>
指定下一条语句的运行点。<linespce>可以是文件的行号,可以是file:line格式,可以是+num这种偏移量格式。表式着下一条运行语句从哪里开始。
jump <address>
这里的<address>是代码行的内存地址。
注意,jump命令不会改变当前的程序栈中的内容,所以,当你从一个函数跳到另一个函数时,当函数运行完返回时进行弹栈操作时必然会发生错误,可能结果还是非常奇怪的,甚至于产生程序Core Dump。所以最好是同一个函数中进行跳转。
熟悉汇编的人都知道,程序运行时,有一个寄存器用于保存当前代码所在的内存地址。所以,jump命令也就是改变了这个寄存器中的值。于是,你可以使用“set $pc”来更改跳转执行的地址。如:
set $pc = 0x485
三、产生信号量
语法是:signal <singal>,UNIX的系统信号量通常从1到15。所以<singal>取值也在这个范围。
single命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由GDB截获的,而single命令所发出一信号则是直接发给被调试程序的。
return
return <expression>
使用return命令取消当前函数的执行,并立即返回,如果指定了<expression>,那么该表达式的值会被认作函数的返回值。
五、强制调用函数
表达式中可以一是函数,以此达到强制调用函数的目的。并显示函数的返回值,如果函数返回值是void,那么就不显示。
另一个相似的命令也可以完成这一功能——print,print后面可以跟表达式,所以也可以用他来调用函数,print和call的不同是,如果函数返回void,call则不显示,print则显示函数返回值,并把该值存入历史数据中。
——————————
下面是几个相关于GDB语言环境的命令:
查看当前的语言环境。如果GDB不能识为你所调试的编程语言,那么,C语言被认为是默认的环境。
info frame
查看当前函数的程序语言。
info source
查看当前文件的程序语言。
如果GDB没有检测出当前的程序语言,那么你也可以手动设置当前的程序语言。使用set language命令即可做到。
(gdb) set language
The currently understood settings are:
local or auto Automatic setting based on source file
c Use the C language
c++ Use the C++ language
asm Use the Asm language
chill Use the Chill language
fortran Use the Fortran language
java Use the Java language
modula-2 Use the Modula-2 language
pascal Use the Pascal language
scheme Use the Scheme language
于是你可以在set language后跟上被列出来的程序语言名,来设置当前的语言环境。
——
于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能。而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成。在这里并不是要和Windows做个什么比较,所谓“寸有所长,尺有所短”,图形化工具还是有不如命令行的地方。(看到这句话时,希望各位千万再也不要认为我就是“鄙视图形界面”,和我抬杠了 )
我是根据版本为5.1.1的GDB所写的这篇文章,所以可能有些功能已被修改,或是又有更为强劲的功能。而且,我写得非常仓促,写得比较简略,并且,其中我已经看到有许多错别字了(我用五笔,所以错字让你看不懂),所以,我在这里对我文中的差错表示万分的歉意。
文中所罗列的GDB的功能时,我只是罗列了一些带用的GDB的命令和使用方法,其实,我这里只讲述的功能大约只占GDB所有功能的60%吧,详细的文档,还是请查看GDB的帮助和使用手册吧,或许,过段时间,如果我有空,我再写一篇GDB的高级使用。
我个人非常喜欢GDB的自动调试的功能,这个功能真的很强大,试想,我在UNIX下写个脚本,让脚本自动编译我的程序,被自动调试,并把结果报告出来,调试成功,自动checkin源码库。一个命令,编译带着调试带着checkin,多爽啊。只是GDB对自动化调试目前支持还不是很成熟,只能实现半自动化,真心期望着GDB的自动化调试功能的成熟。
如果各位对GDB或是别的技术问题有兴趣的话,欢迎和我讨论交流。本人目前主要在UNIX下做产品软件的开发,所以,对UNIX下的软件开发比较熟悉,当然,不单单是技术,对软件工程实施,软件设计,系统分析,项目管理我也略有心得。欢迎大家找我交流,(QQ是:753640,MSN是:[email]haoel@hotmail.com[/email])
用GDB调试程序(七)相关推荐
- 用GDB调试程序(转)
用GDB调试程序 GDB概述 ---- GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做 ...
- 转:用GDB调试程序
从CSDN的网站上找到的GDB使用说明. 原文标题:用GDB调试程序 作者:haoel (QQ是:753640,MSN是: haoel@hotmail.com) 关键字:gdb 调试 ...
- GDB调试程序系列 (3)
GDB调试程序系列 (3) 用GDB调试程序 来源:www.trucy.org (2005-03-23 16:48:14) GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成 ...
- GDB 调试程序 详解 使用实例
用GDB调试程序 GDB概述 ---- GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做 ...
- 【linux】Valgrind工具集详解(六):使用Valgrind gdbserver和GDB调试程序
一.概述 在Valgrind下运行的程序不是由CPU直接执行的.相反,它运行在Valgrind提供的合成CPU上.这就是调试器在Valgrind上运行时无法调试程序的原因. 二.快速入门 在使用Mem ...
- 你还在用GDB调试程序吗?
↑ 点击蓝字 关注视学算法 作者丨薛定谔的喵@知乎 来源丨https://zhuanlan.zhihu.com/p/152274203 编辑丨极市平台 你还在用GDB调试程序吗? 如果是,那么我们是同 ...
- 用GDB调试程序(一)
用GDB调试程序 GDB概述 ---- GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做 ...
- 使用gdb调试程序详解
熟练使用gdb是一个linux下开发人员必备的一项技能,我们由浅入深的学习一下gdb的强大功能. 一.gdb简单介绍 名称 gdb - GNU 调试器 提要 gdb [-help] [ ...
- GDB调试程序-Ubuntu
导读: 用GDB调试程序 出自Ubuntu中文 目录 [隐藏] 1 GDB概述 2 一个调试示例 3 使用GDB 4 GDB的命令概貌 5 GDB中运行UNIX的shell程序 6 在GDB中运行程序 ...
- gdb调试程序函数名为问号,什么原因?step by step解决方案
gdb调试程序函数名为问号,什么原因?step by step解决方案 参考文章: (1)gdb调试程序函数名为问号,什么原因?step by step解决方案 (2)https://www.cnbl ...
最新文章
- 李飞飞团队最新论文:如何对图像中的实体精准“配对”?(附代码论文)
- Spark的RDD分区器
- linux下写sql语言,如何写这个sql语句?
- 最适合做老婆主播不是Rita?不是豚豚,也不是纪小鹿,是她
- java中的字符串相关知识整理
- xx置业有限公司建议篇
- 【CC November Challenge 2012】Arithmetic Progressions【分块】【FFT】
- 机器学习入门系列(1)--机器学习概览
- 模拟知乎登陆(requests和scrapy)
- 甚至有些还掉到书本上
- 浅谈智能语音交互,看一个Windows语音识别程序
- 计算机网络—PPP协议和HDLC协议
- Keepalived 无法自动转换主备角色,请关注 iptables 防火墙配置
- 计算机用户程序举例,劳顿管理信息系统习题集-第8章信息系统安全
- mysql sql 字符串拼接_深入讲解SQL中的字符串拼接
- cruzer php sandisk 闪迪u盘量产工具_SanDisk Cruzer CZ36闪迪U盘 怎么量产
- CDH动态资源池配置
- CSI笔记【9】:阵列信号处理及MATLAB实现(第2版)阅读随笔(一)
- 刻意练习这本书。。。。。。。
- 数栈产品分享:干货解读数据中台产品「模块化」设计思路