GDB(十) 调试正在运行的进程
来源:互联网 发布:pdf密码移除器 mac 编辑:程序博客网 时间:2024/04/29 10:36
我编写了一个循环:
把它编译成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(十) 调试正在运行的进程
- gdb调试正在运行的进程
- gdb调试正在运行的进程
- gdb调试正在运行的进程
- gdb调试正在运行的进程
- gdb调试正在运行的进程
- gdb调试正在运行的进程
- GDB 调试正在运行的进程
- gdb调试正在运行的进程
- gdb用法(三) 调试其他正在运行的进程
- gdb用法(三) 调试其他正在运行的进程
- gdb调试正在运行进程
- GDB调试(正在运行的程序)
- GDB调试(正在运行的程序)
- gdb 调试正在运行的记录
- GDB 调试正在运行的程序
- 使用gdb调试正在运行的程序
- GDB调试正在运行的程序
- C++ static 静态成员变量 和 静态成员函数
- Spring的用法
- Java集合框架概要
- java单例设计模式
- Mysql relay_log 命名规则
- GDB(十) 调试正在运行的进程
- ACE中网络通讯编程基本架构
- ZOJ 3877 Earthstone Keeper(最短路问题)
- 栈的应用---中缀变后缀
- Android开发之蓝牙
- MyChat--山寨QQ
- Active Directory 2003升级至2012(Part5)
- 黑马程序员——Java基础---线程间通信
- datatable.select()