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_vsyscall ()
#1  0x003bb900 in nanosleep () from /lib/i386-linux-gnu/libc.so.6
#2  0x003bb71f in sleep () from /lib/i386-linux-gnu/libc.so.6
#3  0x0804845d in main () at ptype_struct.c:22
可以看到程序正中断在系统调用vsyscall上。用frame 3进入main函数的栈框架并打印i的值,

(gdb) frame 3
#3  0x0804845d in main () at ptype_struct.c:22
22            sleep(1);
(gdb) p i
$1 = 153
next可以执行下一行。

(gdb) next
Single stepping until exit from function __kernel_vsyscall,
which has no line number information.
0x003bb900 in nanosleep () from /lib/i386-linux-gnu/libc.so.6

设置i的值。

(gdb) p i = 999999
$3 = 999999

detach可以分离进程。
(gdb) detach
Detaching from program: /home/tommy/tmp/a.out, process 2570
(gdb) q
[1]+  完成                  ./a.out

如果被调试的进程没有调试信息:

$ strip ./a.out 
$ ./a.out &
[1] 2603
tommy:~/tmp$ gdb
gdb> attach 2603

(gdb) bt
#0  0x00b0f416 in __kernel_vsyscall ()
#1  0x00721900 in nanosleep () from /lib/i386-linux-gnu/libc.so.6
#2  0x0072171f in sleep () from /lib/i386-linux-gnu/libc.so.6
#3  0x0804845d in ?? ()
#4  0x0069e113 in __libc_start_main () from /lib/i386-linux-gnu/libc.so.6
#5  0x08048351 in ?? ()
函数名没有被打印。

 

注意GDB其实可以看作是ptrace系统调用的前端。ptrace专门用来观察和控制另一个进程的执行。观察别的进程可能需要恰当的权限,比如超级用户。不要去调试init进程,不然可能会很伤。我不小心把它杀掉,电脑直接黑屏。

相关资料:

时间: 2024-11-18 23:07:46

GDB(十)--调试正在运行的进程的相关文章

c c++-gdb调试运行的进程,并且不能执行run命令,然后遇到sleep()怎么办,不会等着执行玩吧

问题描述 gdb调试运行的进程,并且不能执行run命令,然后遇到sleep()怎么办,不会等着执行玩吧 gdb调试运行的进程,并且在gdb里不能执行run命令,否则程序检查会抛出异常:在这种情况下sleep()要睡眠5分钟,该怎么办呢,不会一直等着吧: gdb调试运行的进程时,怎么查看运行到哪里了,求助

GDB单步调试基础

最近全面换成 Linux 平台了,感觉如果不玩游戏 Linux 桌面基本可以替代 Windows 了,但是调试器这个还是问题,gdb可以解决这个问题. 一.GDB 概述 GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像 VC . BCB 等 IDE 的调试,但如果你是在 UNIX 平台下做软件,你会发现 GDB 这个调试工具有比 VC . BCB 的图形化调试器更强大的功能.所谓 " 寸有所长,尺有所短 " 就是这个道理

eclipse怎样才能attach到本地正在运行的进程?

问题描述 eclipse怎样才能attach到本地正在运行的进程? 问题如下:(这个问题一直困扰了我好久...) 在linux环境下,有一个程序已经运行起来了,现在想通过eclipse对本地这个已经运行起来的程序进行调试(类似于gdb命令行的attach <pid>),查了N多资料,发现貌似eclipse不支持这种调试方法?没有找到附加到本地当前已经运行程序的按钮或选项. 请教大家如何解决这个问题? gdb命令行的方法我会用,现在就是想看看eclipse是否支持这样使用,要怎样用. 也尝试了C

gdb常用调试命令以及多线程堆栈的查看

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓"寸有所长,尺有所短"就是这个道理. 一般来说GDB主要调试的是C/C++的程序.要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中.使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点.如:       >

云计算设计模式(十九)——运行重构模式

云计算设计模式(十九)--运行重构模式 设计应用程序,使得它可以在不需要重新部署或者重新启动应用程序重新配置.这有助于保持可用性并减少停机时间. 背景和问题 一个主要目的为重要的应用,如商业和企业网站是尽量减少停机时间以及由此引发的中断给客户和用户.但是,有时有必要重新配置应用程序改变特定行为或设置,而在部署和使用.因此,它是用于该应用程序被设计成这样一种方式,以允许在运行时要应用这些配置的变化,并为应用程序,以检测所述变化并且尽快地应用它们的部件的优点. 该种要应用可能被调整记录,以协助与应用

嵌入式arm linux环境中gdb+gdbserver调试

采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试.目标系统必须包括gdbserver程序,宿主机也必须安装gdb程序.在此我们还不能直接采用linux发行版自带的gdb,需要交叉编译gdb和gdbserver. 一.前言 嵌入式Linux系统中,应用开发过程中,很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序.采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gd

gcc gdb-既然GDB只能调试可只执行文件,那莫它的意义何在?

问题描述 既然GDB只能调试可只执行文件,那莫它的意义何在? 当源程序运行GCC时,由于各种错误不能生成可执行文件,就不能进行GDB调试,只能自己根据预处理,编译,链接提示处理来生成可执行文件,那莫GDB的调试意义何在? 解决方案 调试本来就是在运行阶段排错用的.检查源代码的编译错误,那是编译器干的事情.全世界所有的调试器都是这样. 解决方案二: 你那个是编译都过不了,所以不能生成可执行文件,GDB是运行时调试,当然需要先通过语法编译 解决方案三: 编译都过不了还需要调试? 解决方案四: 任何编

2012 10单步 卡-关于VS2008/2012调试器运行慢的问题

问题描述 关于VS2008/2012调试器运行慢的问题 有时候使用VS2008或者 VS2012调试代码的时候, 发现devenv.exe进程占用CPU达40%. 并且按一次F10单步, 哪个怕是步过if(a==0)这样的简单判断条语句都需要10多秒, 在这个过程中查看CPU, 发现devenv.exe占用CPU达30-40. win7 安全关闭安全软件 有VAX插件 请问大家是否遇到过此问题? 如何解决? 解决方案 有时候,就是说在你的电脑上也不是 100% 出现的?如果是这样,请注意一下出现

gcc程序编译和gdb程序调试的基本选项

GCC程序编译 基本格式:gcc [options] [filename] -o 输出可执行文件,如果不给出这个选项,则默认输出a.out可执行文件:如:gcc hello.c -o hello -c 只编译,不连接为可执行文件,生成为以.o为后缀名的目标文件:如:gcc -c hello.c -S 只激活预处理和编译,就是指把文件编 译成为汇编代码.如:gcc -S hello.c    -O 优化编译.连接:-O2对-O再进行优化编译.连接:    -g 编译时,对函数库产生符号信息:(注: