使用gdb进行程序调试1-在GDB中运行程序

在GDB中运行程序

一、启动程序

如果在启动gdb时没有指明程序,可以使用命令file或exec-file加载程序;

run(r):

  run(r)命令使程序启动,可以在run命令中指明程序参数;值得注意的是,首次运行run后,如果再次执行run并且不带参数,会以之前的参数运行程序。

set args:

  指定程序的参数。set args后,run可以不带参数而以指定的参数运行程序。如果set args不太参数,清楚程序参数,执行run后程序不太参数运行。

  在加载程序后,如果程序重新编译,gdb会根据符号文件的更改时间自动重载加载符号文件,所以,不需要重新加载文件。

start:

  使用start命令使程序停在main函数的第一条语句。

二、调试已经在运行的程序

attach pid:

  从ps获得进程号,通过attach命令连接到该进程。attach一个进程后,gdb首先stop该进程,这样就可以设置断点,执行step、continue等命令;如果执行r命令,会杀掉原来的进程。

detach:

  释放该进程,原进程会继续执行。

三、调试多个inferiors和程序

  gdb允许在一个会话下调试多个程序,比如一个进程fork出两个或者多个进程,或者把当前程序复制出一个副本,这些都是通过inferior实现控制。

info inferiors:

  显示当前管理的inferiors。

inferior infono:

  切换到对应的inferior。

add-inferior [-copies n] [-exec executable]:

  添加n(默认为1)个inferior,如果指明executable文件,可以以后通过file加载符号文件。

clone-inferiror [-copies n] [infno]:

  复制编号为infno(默认为当前)的inferior。

其它相关命令:

  remove-inferiors infno

  detach inferior infno

  kill inferiors infno

  maint info program-spaces

四、调试fork

  默认情况下,当一个程序fork,gdb会跟踪父进程而子进程畅通无止的执行。如果在child中设置了一个断点,执行到断点处,child会收到一个SIGTRAP信号,默认为终止程序。

  最开始调试child进程的方法是在child中设置一个sleep,然后通过attach连到child。

set follow-fork-mode mode

show follow-fork-mode:

  在Linux2.5.46以后,gdb支持fork函数的调试;通过set-follow-mode命令,设置跟随parent还是child,如果不设置默认为跟随parent。

set detach-on-fork mode

show detach-on-fork:

  在Linux,可以通过set detach-on fork off命令,在fork后,对parent和child都进行调试。父、子进程为多个inferiors,参见第三部分。

五、多线程调试

info threads:

  显示线程信息。

thread thread-id

  切换到对应线程。

thread name [name]:

  修改当前thread的名称。默认为程序名称。

/******************************************************************

* 本文为博主学习Debugging with GDB的读书笔记,版权所有,转载请注明出处。

*

******************************************************************/

时间: 2024-01-07 03:45:16

使用gdb进行程序调试1-在GDB中运行程序的相关文章

flask 使用程序工厂函数 和 蓝本中实现程序功能

使用程序工厂函数 在单个文件中开发程序很方便,但却有个很大的缺点,因为程序在全局作用域中创建,所以无法动态修改配置. 运行脚本时,程序实例已经创建,再修改配置为时已晚.这一点对单元测试尤其重要,因为有时为了提高测试覆盖度,必须在不同的配置环境中运行程序. 这个问题的解决方法是延迟创建程序实例,把创建过程移到可显式调用的工厂函数中.这种方法不仅可以给脚本留出配置程序的时间,还能够创建多个程序实例,这些实例有时在测试中非常有用.程序的工厂函数在 app 包的构造文件中定义,如示例 7-3 所示.构造

python环境中运行程序

运行Python程序,我们比较常用的是直接在Windows命令提示窗口或者Linux终端或shell窗口中,直接:Python *.py,或者在Linux环境下,在投不中,加入: #!/usr/bin/env python 然后 ./*.py 直接运行 但是进入Python后,该怎么运行呢? 这里就简单介绍一下,这里先简单介绍下os的部分功能. import os; #在Python环境中,引入环境,是必须的:具体可以查看Python中的os os.getcwd(); #得到当前工作目录 os.

第七章 程序是在何种环境中运行的

在这一章中,我知道了应用是必须在一定的环境下才能运行的,其运行环境是操作系统和硬件构成的. 同样类型的硬件可以选择安装多种操作系统,而不同的硬件类型需要不同的操作系统.说起硬件,CPU是特别重要的参数,由于CPU能解释其自身固有的机器语言,所以不同的CPU能解释的机器语言也是不同的.还有就是机器语言的程序称为本地代码,而源代码就是用C语言等编写的程序.(应用软件包收录的是本地代码) 20世纪80年代的MS-DOS操作系统,其每个机型都需要有专门的MS-DOS应用,这是因为应用软件的功能中存在着直

QT中运行程序时出现错误“ QApplication: No such file or directory"

在根目录下创建 一个文件夹,名称为hello,在该文件夹下创建一个hello.cpp文件,内容如下: #include <QApplication> #include <QLabel> int main(int argc, char **argv) { QApplication a(argc, argv); QLabel mylabel("Hello the World"); mylabel.show(); return a.exec(); } 在该文件下运行以

关于在将暴风SDK倒入unity中运行程序出现报错问题

我们将暴风SDK导入我们已经做好的项目中时,发现运行发生报错问题.然后我在它的Demo示例中运行也发现错误.然后根据它的报错我找到问题. 然后我发现.我的IntergrateInputManger中的UnityIput上的脚本发现乱码了.然后我改成了如下图后运行就没有问题了 然后如果你发现你的MojingInputManger上脚本变量也是乱码时,再更改为如下就好了

使用GDB调试Android NDK native(C/C++)程序

使用GDB调试Android NDK native(C/C++)程序 先说明下,这里所谓的ndk native程序跟Android上层java应用没有什么关系,也不需要涉及jni来封装native接口,通俗来讲,就是把编译好的纯C/C++程序,push到Android设备或者仿真器上,然后在设备上运行该程序.而调试则是通过attach到gdbserver来实现.推荐在Ubuntu或者mac osx下来进行,windows下要安装cygwin来模拟posix环境,速度很慢的说.具体操作如下: 0.

使用GDB调试Android NDK native(C/C++)程序-转

最 近写了些需要跨平台兼容的C++库,Android是其中需要兼容的平台之一.区别于Windows,Mac中功能强大的IDE环境,官方并没有为 Android ndk提供太多的支持.因此,尝试了下通过一些配置使用gdb来调试Android ndk的C++程序,感觉还算方便,记录下来跟大家分享. 先 说明下,这里所谓的ndk native程序跟Android上层java应用没有什么关系,也不需要涉及jni来封装native接口,通俗来讲,就是把编译好的纯C/C++程 序,push到Android设

针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调试,从而获得程序运行状态下的信息( 关闭 ALSR 机制 ),基础的 gdb 操作可参见笔者的文章Linux下编辑.编译.调试命令总结--gcc和gdb描述.使用 gdb 可以方便的获取程序动态运行状态下的信息,但通过 gdb 动态调试获取的诸如缓冲区的起始地址等信息可能与程序实际运行时的信息并不相

gdb的基本调试方法

1.怎么调试程序 在linux下,我们通常用gcc来编译链接程序,用gdb来调试程序.在用gcc生成程序的时候,用-g选项来使程序可以调试: [email protected]:~/gdb$ gcc -g -Wall gdbtest.c -o gdbtest 然后在用如下命令调试程序: [email protected]:~/gdb$ gdb gdbtest 2.gdb的基本命令介绍 run 在gdb中运行你的程序,一般会在你设置的断点地方停止. start 也是在gdb中运行程序,不过默认实在