用 gcc 编译生成可执行程序,并在编译的过程中添加调试信息。修改系统设置,使系统可以生成 core 文件。执行可执行程序,看一下会发生什么错误。并用 gdb 查看 core 文件的信息。(查看栈的调用情况,查看某一个具体栈帧里面的参数和局部变量) // test.c int div(int div_i, int div_j) { int a4, b4; char *c4; a4 = div_i + 3; b4 = div_j + 3; c4 = "div function"; return (div_i / div_j); } int sub(int sub_i, int sub_j) { int a3, b3; char *c3; a3 = sub_i + 2; b3 = sub_j + 2; c3 = "sub function"; div(a3, 0); // Error: divided by 0! return (sub_i - sub_j); } int add(int add_i, int add_j) { int a2, b2; char *c2; a2 = add_i + 1; b2 = add_j + 1; c2 = "add function"; sub(a2, b2); return (add_i + add_j); } int main(int argc, char *argv[]) { int a1, b1; char *c1; a1 = 1; b1 = 0; c1 = "main function"; add(a1, b1); return 0; }
时间: 2024-01-13 22:02:15 浏览: 104
好的,这是一个不错的问题。首先,我们需要编写一个 Makefile 文件来编译我们的代码并添加调试信息。以下是一个简单的 Makefile 文件的例子:
```
CC=gcc
CFLAGS=-g
all: test
test: test.c
$(CC) $(CFLAGS) -o $@ $<
clean:
rm -f test
```
我们可以使用 `make` 命令来编译我们的代码并生成可执行文件 `test`。
接下来,我们需要修改系统设置,以便生成 core 文件。在 Linux 系统中,我们可以使用 `ulimit` 命令来修改 core 文件生成的限制。例如,我们可以使用以下命令来设置 core 文件的大小为无限制:
```
ulimit -c unlimited
```
现在,我们可以运行可执行程序 `test`,并且当它遇到错误时,它将会生成一个 core 文件。
```
./test
Segmentation fault (core dumped)
```
当我们运行可执行程序 `test` 时,它会遇到错误并生成一个 core 文件。接下来,我们可以使用 gdb 工具来查看 core 文件的信息。
```
gdb test core
```
在 gdb 中,我们可以使用 `bt` 命令来查看栈的调用情况。例如,以下是一个例子:
```
#0 0x00007f8f9c3a7d10 in ?? ()
#1 0x000000000040070b in div (div_i=3, div_j=0) at test.c:3
#2 0x0000000000400783 in sub (sub_i=5, sub_j=2) at test.c:14
#3 0x00000000004007b3 in add (add_i=1, add_j=1) at test.c:23
#4 0x00000000004007d3 in main (argc=1, argv=0x7ffcc4f213f8) at test.c:34
```
我们可以看到,在调用 `div` 函数时发生了错误。我们还可以使用 `info args` 命令来查看某个栈帧里面的参数,以及使用 `info locals` 命令来查看某个栈帧里面的局部变量。例如:
```
(gdb) frame 1
#1 0x000000000040070b in div (div_i=3, div_j=0) at test.c:3
3 a4 = div_i + 3;
(gdb) info args
div_i = 3
div_j = 0
(gdb) info locals
a4 = 6
b4 = 3
c4 = 0x40082a "div function"
```
在这个例子中,我们可以看到 `div` 函数的参数,以及局部变量的值。我们可以使用 `next` 命令来逐步执行代码,并查看变量的值的变化。
希望这个例子能够帮助你理解如何使用 gcc 和 gdb 来编译和调试代码,并查看 core 文件的信息。
阅读全文