【问题标题】:When using GDB, how do you see which C (not Assembly) instruction that GDB has stopped upon?使用 GDB 时,您如何查看 GDB 停止在哪条 C(不是汇编)指令上?
【发布时间】:2011-10-20 11:03:25
【问题描述】:

看,问题是我应该使用可执行驱动程序 (vdriver) 来测试我编写的 C 源文件 (myfile.c),其中包含驱动程序将使用的方法集合。我使用 gcc 将它们编译在一起(以及它们依赖的任何文件),然后运行“gdb vdriver”

显然,我在 myfile.c 中的某处遇到了段错误。 “分解”产生的汇编代码甚至可以在汇编中显示整个方法并指向刚刚发生段错误的指令。

但是,由于汇编代码的复杂性(和长度),我认为查看 C 中发生段错误的这一行会更有效。

但是,运行命令“list *$eip”会导致:

    No source file for address 0x804a3d3

有人知道怎么做吗?

【问题讨论】:

    标签: c gdb


    【解决方案1】:

    使用调试信息进行编译。

    gcc -ggdb -c source.c -o source.o ...

    更新:您似乎在调用 GCC 时也遇到了问题。我建议编写一个 Makefile,并快速浏览一下 GCC 手册,了解 -c-o 的含义。

    CC = gcc
    CFLAGS = -ggdb -Wall # or whatever flags you want, read the manual
    
    # List all files, with *.c changed to *.o (Make will figure the rest out)
    my_app : file1.o file2.o file3.o file4.o
            $(CC) -o my_app $^
    # The above line should start with a tab, not spaces
    
    clean :
            rm -f my_app *.o
    
    # List dependencies like this (technically optional)
    # But if you don't do it, "make" might not re-make things that need it
    file1.o : file1.c header.h header2.h
    file2.o : file2.c header.h
    

    【讨论】:

    • Dietrich,我正是这样做的,但是在设置断点然后尝试使用“list”查看 C 行时仍然给我同样的错误...
    • 你能解释一下“-ggdb”应该做什么吗?
    • 我相信-ggdb 与大多数系统上的-g 相同; -g 是人们习惯的..
    • @R..:我过去曾在许多系统上运行过,这些系统使用-g 提供了不足的调试符号。无论如何,如果您使用的是 gdb,使用-ggb 并没有什么坏处。
    • @JacobHayden: -ggdb 将调试信息添加到您的程序中。如果没有这些信息,GDB 无法确定每条指令对应的代码行。你能发布你用于编译的确切命令吗?或者尝试使用“backtrace”命令运行回溯?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多