主页

索引

模块索引

搜索页面

8.5. gdb

命令:

l,即 list,用于显示多行源代码。
b,即 break,用于设置断点。
r,即 run,用于开始运行程序。
n,即 next,用于执行下一条语句。如果该语句为函数调用,则不会进入函数内部执行。
p,即 print,用于打印内部变量值。
s,即 step,用于执行下一条语句。如果该语句为函数调用,则进入函数,执行其中的第一条语句。
c,即 continue,用于继续程序的运行,直到遇到下一个断点。
bt,即 backtrace,用于查看函数调用信息。
q,即 quit,用于退出 gdb 环境。

示例:

$ gdb ./a.out
GNU gdb (Ubuntu 8.1-0ubuntu3.1) 8.1.0.20180409-git
......
Reading symbols from ./a.out...done.
(gdb) l
1       #include <stdio.h>
2       #include <stdlib.h>
3       #include <unistd.h>
4       #include <linux/kernel.h>
5       #include <sys/syscall.h>
6       #include <string.h>
7
8       int main ()
9       {
10        char * words = "I am liuchao from user mode.";
(gdb) b 10
Breakpoint 1 at 0x6e2: file syscall.c, line 10.
(gdb) r
Starting program: /root/syscall/a.out
Breakpoint 1, main () at syscall.c:10
10        char * words = "I am liuchao from user mode.";
(gdb) n
12        ret = syscall(333, words, strlen(words)+1);
(gdb) p words
$1 = 0x5555555547c4 "I am liuchao from user mode."
(gdb) s
__strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:79
(gdb) bt
#0  __strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:79
#1  0x00005555555546f9 in main () at syscall.c:12
(gdb) c
Continuing.
return 63 from kernel mode.
[Inferior 1 (process 1774) exited normally]
(gdb) q

8.5.1. 临时

$ gdb --pid=<worker process ID> -ex='handle SIGINT pass' -ex='c'

主页

索引

模块索引

搜索页面