GDB改变程序的执行

一旦使用GDB挂上被调试程序,当程序运行起来后,你可以根据自己的调试思路来动态地在GDB中更改当前被调试程序的运行线路或是其变量的值,这个强大的功能能够让你更好的调试你的程序,比如,你可以在程序的一次运行中走遍程序的所有分支。

修改变量值

修改被调试程序运行时的变量值,在GDB中很容易实现,使用GDB的print命令即可完成。如:

(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.

因为,set width是GDB的命令,所以,出现了“Invalid syntax in expression”的设置错误,此时,你可以使用set var命令来告诉GDB,width不是你GDB的参数,而是程序的变量名,如:

(gdb) set var width=47

另外,还可能有些情况,GDB并不报告这种错误,所以保险起见,在你改变程序变量取值时,最好都使用set var格式的GDB命令。

跳转执行

一般来说,被调试程序会按照程序代码的运行顺序依次执行。GDB提供了乱序执行的功能,也就是说,GDB可以修改程序的执行顺序,可以让程序执行随意跳跃。这个功能可以由GDB的jump命令来完:

jump <linespec>

指定下一条语句的运行点。<linespce>可以是文件的行号,可以是file:line格式,可以是+num这种偏移量格式。表示着下一条运行语句从哪里开始。
&">nbsp;
jump <address>

这里的<address>是代码行的内存地址
 
注意,jump命令不会改变当前的程序栈中的内容,所以,当你从一个函数跳到另一个函数时,当函数运行完返回时进行弹栈操作时必然会发生错误,可能结果还是非常奇怪的,甚至于产生程序Core Dump。所以最好是同一个函数中进行跳转。

熟悉汇编的人都知道,程序运行时,有一个寄存器用于保存当前代码所在的内存地址。所以,jump命令也就是改变了这个寄存器中的值。于是,你可以使用“set $pc”来更改跳转执行的地址。如:

set $pc = 0x485

产生信号量

使用singal命令,可以产生一个信号量给被调试的程序。如:中断信号Ctrl+C。这非常方便于程序的调试,可以在程序运行的任意位置设置断点,并在该断点用GDB产生一个信号量,这种精确地在某处产生信号非常有利程序的调试。

语法是:signal <singal>,UNIX的系统信号量通常从1到15。所以<singal>取值也在这个范围。

single命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由GDB截获的,而single命令所发出一信号则是直接发给被调试程序的。

强制函数返回

如果你的调试断点在某个函数中,并还有语句没有执行完。你可以使用return命令强制函数忽略还没有执行的语句并返回。

return
return <expression>

使用return命令取消当前函数的执行,并立即返回,如果指定了<expression>,那么该表达式的值会被认作函数的返回值。

强制调用函数

call <expr>

表达式中可以一是函数,以此达到强制调用函数的目的。并显示函数的返回值,如果函数返回值是void,那么就不显示。

另一个相似的命令也可以完成这一功能——print,print后面可以跟表达式,所以也可以用他来调用函数,print和call的不同是,如果函数返回void,call则不显示,print则显示函数返回值,并把该值存入历史数据中。

时间: 2024-07-30 05:36:32

GDB改变程序的执行的相关文章

从底层简析Python程序的执行过程

  这篇文章主要介绍了从底层简析Python程序的执行过程,包括注入操作码和封装程序等解释器执行层面的知识,需要的朋友可以参考下 最近我在学习 Python 的运行模型.我对 Python 的一些内部机制很是好奇,比如 Python 是怎么实现类似 YIELDVALUE.YIELDFROM 这样的操作码的;对于 递推式构造列表(List Comprehensions).生成器表达式(generator expressions)以及其他一些有趣的 Python 特性是怎么编译的;从字节码的层面来看

《深入剖析Nginx》一2.4 获得Nginx程序完整执行流程

2.4 获得Nginx程序完整执行流程 深入剖析Nginx 利用strace命令能帮助我们获取到Nginx在运行过程中所发起的所有系统调用,但是不能看到Nginx内部各个函数的调用情况.利用gdb调试Nginx能让我们很清晰地获得Nginx每一步的执行流程,但是单步调试毕竟是非常麻烦的,有没有更为方便的方法一次性获得Nginx程序执行的整个流程呢?答案是肯定的,而且方法还非常多1.虽然相比直接使用某些强大工具(如System Tap2)而言,下面要介绍的方法比较笨,但它的确可行,而且从这个过程中

《深入剖析Nginx》——2.4 获得Nginx程序完整执行流程

2.4 获得Nginx程序完整执行流程 利用strace命令能帮助我们获取到Nginx在运行过程中所发起的所有系统调用,但是不能看到Nginx内部各个函数的调用情况.利用gdb调试Nginx能让我们很清晰地获得Nginx每一步的执行流程,但是单步调试毕竟是非常麻烦的,有没有更为方便的方法一次性获得Nginx程序执行的整个流程呢?答案是肯定的,而且方法还非常多1.虽然相比直接使用某些强大工具(如System Tap2)而言,下面要介绍的方法比较笨,但它的确可行,而且从这个过程中也许能学到一些额外的

王爽-为什么我的中断程序无法执行

问题描述 为什么我的中断程序无法执行 我没有修改过中断向量地址表,也没有改过中断程序,只是想直接调用中断程序10h的2号子程序改变光标位置,可是执行到int 10h后下一步就无法执行了,查看中断程序10h的地址第一行的指令就是三个问号. 其实我发现我调用了几个中断程序到那一步都会卡住,请问怎么解决? 解决方案 0AH:在当前光标处显示字符

Asp.Net在Web应用程序中执行计划任务(多线程)

asp.net|web|程序|多线程|执行 在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务.实现计划任务的方法也有很多,可以采用SQLAgent执行存储过程来实现,也可以采用Windows任务调度程序来实现,也可以使用Windows服务来完成我们的计划任务,这些方法都是很好的解决方案.但是,对于Web应用程序来说,这些方法实现起来并不是很简单的,主机服务提供商或者不能直接提供这样的服务

Python程序的执行原理

1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行. 2. 字节码 字节码在Python虚拟机程序里对应的是PyCodeObject对象. .pyc文件是字节码在磁盘上的表现形式. 3. pyc文件 PyCodeObject对象的创建时机是模块加载的时候,即import. Python test.py会对test.py进行编译成字节码并解释执行,但是不会生成test.pyc. 如果test.py加载了其他模块,如

Win7该文件没有与之关联的程序来执行操作怎么办

  一.查找安装对应的打开程序 1.造成该文件没有程序与之关联的程序来执行操作的第一种原因是普遍存在的,因为我们的电脑上确实缺少对应的查看软件,要判断要安装什么软件才能打开文件就得判断文件是什么格式的,可以通过查看文件属性知道文件类型,如图,右键查看文件属性就可以看到文件类型是RAR 文件 (.rar). 2.那么我们就可以百度搜索一下这种格式的文件是要用什么程序打开了,下载安装对应的软件就可以了.需要搜索的正常是比较不常用的文件类型,常见的可以参考下面的文件类型. 3.图片格式常见的有BMP格

Windows7计算机管理提示&quot;该文件没有与之关联的程序来执行该操作&quot;解决方法

 今天右键计算机-管理,居然提示"该文件没有与之关联的程序来执行该操作.请安装一个程序.或者,如果已安装程序,请在"默认程序"控制面板中创建关联."怀疑是自己上次用去除快捷方式造成的问题.下面是两种解决方法,我用了方法2就搞定了. 代码如下:<p>Windows Registry Editor Version 5.00</p><p>[HKEY_CLASSES_ROOTCLSID{20D04FE0-3AEA-1069-A2D8-08

select-SQL可以再客户端执行不能在程序中执行,求大神指点?急

问题描述 SQL可以再客户端执行不能在程序中执行,求大神指点?急 SQL如下: select distinct b.COLUMN_NAME,b.comments,a.column_id from user_tab_columns a,user_col_comments b where a.column_name=b.column_name and b.table_name=upper('YFRAME_STU') order by a.column_id; 解决方案 upper('YFRAME_S