【问题标题】:gdb without gcc没有 gcc 的 gdb
【发布时间】:2010-01-22 04:22:50
【问题描述】:

是否可以使用由as 组装并与ld 链接的程序运行GDB?使用 gcc 添加标志 -g 允许调试,但当我尝试向加载的程序添加断点时出现错误 No symbol table is loaded. Use the "file" command

谢谢!

编辑也许我应该明确表示我正在学习和编程汇编。我真正想要的只是堆栈跟踪,但能够使用 GDB 会很棒。

解决方案运行as -g 可以解决问题。

感谢所有回答的人!

【问题讨论】:

    标签: linux assembly gdb


    【解决方案1】:

    这是可能的。但是,您需要符号才能添加符号断点,并且符号由调试信息提供;确保您的汇编器和链接器提供这些。 编辑 使用 GNU as,使用 as -g。或者直接使用gcc -g:如果你给它一个.s文件,它会根据需要调用汇编器和链接器。

    GDB 理解多种格式的调试信息:stabsCOFFPEDWARFSOM。 (其中一些是带有调试部分的可执行格式,另一些是可以嵌入到可执行文件中的调试信息格式,例如 ELF。)gcc -g 通常选择平台的默认值,gcc -ggdb 通常选择最具表现力的(取决于你的版本,可能是 DWARF-3)。

    如果您在可执行文件中嵌入或链接到调试信息,gdb 将尝试自动加载它。如果您在其他地方有它,您可能需要使用file 告诉gdb 在哪里可以找到它。

    您仍然可以在没有符号信息的情况下进行调试。例如,如果那里有任何代码,您可以发出break *0x89abcdef 在该地址插入断点。

    【讨论】:

      【解决方案2】:

      您可以尝试使用 --gdwarf-2 或 -g 选项运行 as,并确保未使用 --strip-debug 调用 ld,并且您的 makefile/安装过程不会剥离可执行文件.

      【讨论】:

        【解决方案3】:

        这不是阻止调试的错误,而是以您尝试执行此操作的方式设置断点的错误。由于 GDB 没有任何符号信息,因此您必须以其他方式设置断点。

        【讨论】:

        • 你能告诉我其他方式是什么吗?
        • @Tyler:如果我知道的话,我会的。 :)
        【解决方案4】:

        如果您没有符号表,则无法以符号方式设置断点(通过函数名、代码行等)。如果您知道要停止的地址,您仍然可以为特定地址设置断点。

        gdb>  b 0x12345678

        当然,这只有在您知道要在 0x12345678 处停止时才有用

        file 对您的可执行文件有什么看法?

        【讨论】:

        • Reading symbols from ~/Programming/ASM/largest_number...(no debugging symbols found)...done.largest_number 与as 组装并与ld 链接
        • 公平地假设您确实想要使用符号断点?检查 ld 的参数,这可能是一种添加符号表的方法。检查 man as 和 man ld?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        • 2017-12-07
        • 2018-09-30
        • 2010-12-03
        相关资源
        最近更新 更多