4. 堆栈
查看调用堆栈(call stack)无疑是调试过程中非常重要的事情。
#0 test (a=4096, b=8192) at hello.c:5
#1 0x0804843b in main () at hello.c:13
#0 test (a=4096, b=8192) at hello.c:5
5 int c = a + b;
可以用 frame 修改当前堆栈帧,然后查看其详细信息。
#1 0x0804843b in main () at hello.c:13
13 int c = test(a, b);
5. 变量和参数
c = 0
8. 进程
查看进程相关信息,尤其是 maps 内存数据是非常有用的。
Show /proc process information about any running process.
Specify any process id, or use the program being debugged by default.
Specify any of the following keywords for detailed info:
mappings – list of mapped memory regions.
stat – list a bunch of random process info.
status – list a different bunch of random process info.
all – list all available /proc info.
process 22561
cmdline = ‘/home/yuhen/Learn.c/hello’
cwd = ‘/home/yuhen/Learn.c’
exe = ‘/home/yuhen/Learn.c/hello’
Mapped address spaces:
9. 线程
可以在 pthread_create 处设置断点,当线程创建时会生成提示信息。
Continuing.
[New Thread 0xb7e78b70 (LWP 2933)]
- 2 Thread 0xb7e78b70 (LWP 2933) test (arg=0x804b008) at main.c:24
1 Thread 0xb7e796c0 (LWP 2932) 0xb7fe2430 in __kernel_vsyscall ()
#0 test (arg=0x804b008) at main.c:24
#1 0xb7fc580e in start_thread (arg=0xb7e78b70) at pthread_create.c:300
#2 0xb7f478de in clone () at …/sysdeps/unix/sysv/linux/i386/clone.S:130
[Switching to thread 1 (Thread 0xb7e796c0 (LWP 2932))]#0 0xb7fe2430 in __kernel_vsyscall ()
#0 0xb7fe2430 in __kernel_vsyscall ()
#1 0xb7fc694d in pthread_join (threadid=3085405040, thread_return=0xbffff744) at pthread_join.c:89
#2 0x08048828 in main (argc=1, argv=0xbffff804) at main.c:36
10. 其他
调试子进程。
临时进入 Shell 执行命令,Exit 返回。
调试时直接调用函数。
使用 "--tui" 参数,可以在终端窗口上部显示一个源代码查看窗。
查看命令帮助。
最后就是退出命令。
和 Linux Base Shell 习惯一样,对于记不住的命令,可以在输入前几个字母后按 Tab 补全。
----------- 分隔线 ---------------
GDB 还有很多指令,功能也异常强大。不过对于熟悉了 VS 那种豪华 IDE 的人来说,这种命令行调试是种巨大的痛苦。尽管我个人建议多用 GDB,但也不反对用 GUI 调试器来加快调试进程。Nemiver 就不错,推荐一下。