如何在使用gdb调试核心转储时设置断点并使其中断? 当我使用命令“gdb program core”时,进程在崩溃点停止, 如何在暂停之前使进程中断。 如果我无法破解,在调试核心转储时我可以在gdb中使用哪些命令?
答案 0 :(得分:2)
如果要跟踪导致崩溃的步骤,可以在加载核心后重新启动程序。使用' start',这会将您带到程序的第一行。然后在main()和崩溃点之间设置断点。 见下面的示例:
<pre>
[narz@dev101 src]$ gdb -n -quiet myprogram core.12046
Reading symbols from </my/path/>...done.
[New Thread 12046]
Reading symbols from /usr/lib64/libstdc++.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib64/libstdc++.so.6
Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libgcc_s.so.1
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Core was generated by `./myprogram'.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000400658 in main () at stack.cpp:6
6 int b=*x;
(gdb) p x
$1 = (int *) 0x0
(gdb) l
1 #include <iostream>
2
3 int main(void)
4 {
5 int* x=NULL;
6 int b=*x;
7 return 0;
8 }
(gdb) start
No core file now.
Temporary breakpoint 1 at 0x40064c: file stack.cpp, line 5.
Starting program: /u03/narz/projects/xxxxx/xxxxx/src/myprogram
Temporary breakpoint 1, main () at stack.cpp:5
5 int* x=NULL;
(gdb)
</pre>
答案 1 :(得分:1)
检查核心文件时,您可以列出堆栈跟踪或查看已执行的函数参数:
gdb <program> <core>
(gdb) backtrace
(gdb) print <variable or *address>
如果你想设置断点,用gdb打开一个没有核心文件的程序,这样就可以运行它了:
gdb <program>
(gdb) break <line>
(gdb) run