gdb动态挂运行程序并调试

/*
 * gdb动态挂运行程序并调试
 * 编译程序:
 * gcc gdb_attach2.c -o gdb_attach2 -g
 *
 * 运行程序:
 * ./gdb_attach2
 *
 * 查看程序进程代号:
 * ps ax | grep gdb_attach2
 * 3973 pts/0    S+     0:00 ./gdb_attach2
 *
 * 启用gdb挂载程序:
 * gdb gdb_attach2 3973
 *
 * 在目标位置设置断点
 * b gdb_attach2.c:44
 * Breakpoint 1 at 0x40052f: file gdb_attach2.c, line 44.
 *
 * 设置断点执行指令
 * (gdb) command 1
 * Type commands for breakpoint(s) 1, one per line.
 * End with a line saying just "end".
 * >p i
 * >c
 * >end
 *
 * 设置gdb环境
 * set height 0
 *
 * 继续运行程序
 * (gdb) c
 *
 * 退出gdb程序
 * CTRL-C
 * quit
 */
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int fun(int cnt)
{
	int i;
	for(i=0;i<cnt;++i)
	{
		printf("in fun i=%d\n",i);
		sleep(1);
	}
	return 0;
}

int main()
{
	fun(1000);
	return 0;
}

时间: 2024-09-28 16:21:12

gdb动态挂运行程序并调试的相关文章

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

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

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

在GDB中运行程序 一.启动程序 如果在启动gdb时没有指明程序,可以使用命令file或exec-file加载程序: run(r): run(r)命令使程序启动,可以在run命令中指明程序参数:值得注意的是,首次运行run后,如果再次执行run并且不带参数,会以之前的参数运行程序. set args: 指定程序的参数.set args后,run可以不带参数而以指定的参数运行程序.如果set args不太参数,清楚程序参数,执行run后程序不太参数运行. 在加载程序后,如果程序重新编译,gdb会根

gdb系列之四 在GDB里运行程序

在你开始在GDB里运行程序前,你需要在编译的时候产生调试信息. 你可以在你选定的环境里带参数(如果有的话)的启动GDB.如果你是在本地调试,你可以重定向输入输出,调试一个已运行 的进程,或者结束一个进程. 4.1 为调试而编译 为了有效的调试程序,你需要在编译的时候产生调试信息.调试信息存储在目标文件里:调试信息描述了数据和函数的类型, 源代码和可执行代码的对应关系. 编译时指定编译器的'-g'选项可以产生调试信息. 在编译给你的客户发布的程序时,可以用'-O'选项指定编译器进行优化.然而,许多

利用GDB对程序进行调试

第一章初涉调试会话 调试工具 GDB Unix下最常用的调试工具 DDD 基于GUI的调试器,大多数工具都是GDB的GUI前端. Eclipse IDE也是一种调试工具 atoi( )把字符串变为整数,头文件是include<stdlib.h> gcc -g -Wall -o insert_sort ins.c -g选项可以让编译器将符号表(对应于程序的变量和代码行的内存地址列表)保存在生成的可执行文件里中. 这样才能在调试会话的过程中引用源代码中的变量和行号,比如"在第30行停止&

linux 下C/C++程序常用调试方法(gdb)

 不管是在开发或者运行过程中,调试保证程序正常运行最基本的手段,熟悉这些调试方式,方便我们更快的定位程序问题所在,提高开发效率. 一 程序正常运行调试 (1)  直接使用gdb 开发过程中最常用的方式,我们可以在其过程中给程序添加断点,监视等辅助手段,监控其行为是否与我们设计相符,比如: (2)      程序已经运行,通过attach附加到进程 二 程序中断后调试 首先简单介绍下linux 下的信号: 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过

GDB(十)--调试正在运行的进程

我编写了一个循环: long i;    for (i = 0; i < 999999; i++) {        mt.a += 1;        sleep(1);    }把它编译成a.out,并在后台执行它:./a.out & [1] 2570 然后用命令gdb ./a.out 2570可以附加到这个进程上.被时进程会中断. 或者在GDB里输入attach 2570同样可以附加到进程. 输入bt来查看栈 (gdb) bt#0  0x008e9416 in __kernel_vsy

Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)

记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += -g QMAKE_LINK += -g 在终端输入 ulimit -c 显示为 0 然后输入 ulimit -c unlimited 继续在终端运行编写的程序 出错后,会在当前目录生成 core 文件 然后在终端执行 “gdb 你的程序名 core” 然后输入 bt 对该错误进行跟踪调试 (gdb)

Android中插件开发篇之----动态加载Activity(免安装运行程序)

一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析),没看过的同学,可以转战: http://blog.csdn.NET/jiangwei0910410003/article/details/47679843 当然,今天说道的内容还这这篇文章有关系.关于动态加载Activity的内容,网上也是有很多文章介绍了.但是他们可能大部分都是介绍通过代理的方

gdb动态库延迟断点及线程/进程创建相关事件处理(下)

一.被调试任务所有so文件如何枚举在前一篇博客中,大致说明了gdb是通过一个动态库提供的回调函数(_dl_debug_state)处埋伏断点,然后通过约定好的_r_debug全局变量来得到exe程序对应的link_map,然后以该结构为队列头来遍历被调试任务中所有的so文件.当时也说了这个地方比较模糊,只是说了一个思路,所以这里再试图把这个实现相对详细的描述一下.二.定义被调试任务(debuggee)的link_map地址同样是在gdb-6.5\gdb\solib-svr4.c文件中,其中包含了