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进程,不然可能会很伤。我不小心把它杀掉,电脑直接黑屏。
相关资料:
GDB(十)--调试正在运行的进程的更多相关文章
- Linux 查看运行中进程的 umask
线上某台虚机因为故障重装了系统(基线 CentOS 6.9 内核 2.6.x),重新部署了应用.这个应用会生成一个文件,到NFS挂载目录. 而这个 NFS 挂载目录是一个 FTP 服务器的目录.另一台 ...
- gdb命令调试技巧
gdb命令调试技巧 一.信息显示1.显示gdb版本 (gdb) show version2.显示gdb版权 (gdb) show version or show warranty3.启动时不显示提示信 ...
- GDB代码调试与使用
GDB代码调试与使用 Linux下GDB调试代码 源代码 编译生成执行文件 gcc -g test.c -o test 使用GDB调试 启动GDB:gdb test 从第一行列出源代码:list 直接 ...
- gdb各种调试命令和技巧
陈皓:用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台 ...
- GDB常用调试命令(一)
GDB是UNIX及UNIX-like下的调试工具,通常gdb使用前置条件:编译时加入debug信息,这里指的是C++. gcc/g++调试选项 gcc/g++是在编译时加入-g,-g分4个等级: ...
- gdb调试正在运行的程序
1.ps aux | grep mxx.exe 查找可执行程序的进程id 2.gdb attach pid attach可执行程序的进程pid 3.continue/c 或者continue or c ...
- Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动
姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/a ...
- 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案
基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...
- gdb 远程调试android进程 -转
什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停 ...
随机推荐
- rune 切片 go
package main import ( "fmt" ) func main() { var s = "go程序``**//;;''[p]=-\\&|@#$%^ ...
- Google、Mozilla、Qt、LLVM 这几家的规范是明确禁用异常的
作者:陈硕链接:https://www.zhihu.com/question/22889420/answer/22975569来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- worktools-git 工具的使用总结(2)
1.创建分支 git branch son parent //创建分支,是在master 分支的基础上创建 :~/myGit$ git st # On branch master nothing to ...
- checkbox-padding 调整checkbox字体跟图标距离
有时候我们会遇到需要调整控件中的内容相对于容器的位置.这里有两种情况 1.linearlayout这样的容器中,包含button类的控件,这时候margin可以调节 2.textview中的文字内容 ...
- JavaScript中的global对象,window对象以及document对象的区别和联系
JavaScript中的global对象,window对象以及document对象的区别和联系 一.概念区分:JavaScript中的global对象,window对象以及document对象 1.g ...
- 企业部署Linux应用将拥有更低的TCO
650) this.width=650;" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" ...
- MSSQL相关用法
一.分页查询 方式一(row_number): SELECT TOP pageSize * FROM (SELECT row_number() OVER (ORDER BY orderColumn) ...
- 让我们彻底看清MVC、MVP
这里開始记录下来自己对MVC.MVP.MVVM这三种框架模式的理解,本文从以下几个方面来梳理. 架构的目的 框架模式.设计模式 MVC设计的介绍 MVC在Android中的应用 MVC该怎样设计 MV ...
- [Javascript AST] 3. Continue: Write ESLint rule
The rule we want to write is show warning if user using console method: // valid foo.console() conso ...
- input选中 和 select点击下拉选择获取选中选项的值
1.input选中$('#checkBox').find('input').each(function(i){ if($(this).prop('checked')){//获取是否选中 并判断 $(t ...