【问题标题】:View Both Assembly and C code查看汇编和 C 代码
【发布时间】:2012-04-02 03:41:28
【问题描述】:

我们有办法使用 gdb 查看汇编和 c 代码吗?

disassemble function_name 仅显示程序集,我试图找到一种将 c 代码轻松映射到程序集的方法。 谢谢

【问题讨论】:

    标签: gdb


    【解决方案1】:

    您可以在 文本用户界面 (TUI) 模式下运行 gdb:

    gdb -tui <your-binary>
    (gdb) b main
    (gdb) r
    (gdb) layout split
    

    layout split 命令将窗口分为两部分——其中一部分显示源代码,另一部分显示相应的程序集。 其他一些技巧:

    • set disassembly-flavor intel - 如果你喜欢 intel 表示法
    • set print asm-demangle - 在程序集视图中对 C++ 名称进行解码
    • ni - 下一条指令
    • si - 步骤说明

    如果您不想使用 TUI 模式(例如您的终端不喜欢它),您可以随时这样做:

    x /12i $pc
    

    这意味着从当前程序计数器地址打印 12 条指令 - 这也适用于上述技巧(解构、步进指令等)。

    “x /12i $pc”技巧适用于 gdb 和 cgdb,而“布局拆分”仅适用于 gdb。

    享受:)

    【讨论】:

    • 有什么办法也可以摆脱顶部拆分窗口吗?这是不必要的,而且占用空间。
    • @BabkenVardanyan 试试layout next。如果它没有为您提供所需的布局,请再尝试几次此命令。此命令不断在布局之间切换,因此您可以保留所需的布局。
    • 还有什么方法可以查看layout regs中的寄存器?
    【解决方案2】:

    试试disassemble /m

    参考http://sourceware.org/gdb/current/onlinedocs/gdb/Machine-Code.html#Machine-Code

    格式与objdump -S类似,源码与反汇编混用。示例输出摘录:

    10      int i = 0;
    => 0x0000000000400536 <+9>: movl   $0x0,-0x14(%rbp)
    
    11      while (1) {
    12          i++;
       0x000000000040053d <+16>:    addl   $0x1,-0x14(%rbp)
    

    【讨论】:

    • 我不想要其他解决方案,因为我不想重新启动 gdb 并再次以相同的方式设置它,并且 .o 文件对重定位部分的引用使其难以理解。所以我以为这只是票。想象一下我的恐惧,然后,当我最终意识到 disassemble/m 默默地省略了一些指令时,比如在第一条三字节指令之后:` 0x000000000442f038 : mov %rsi,%rbx 0x000000000442f043 : sub $0x38 ,%rsp` 那是GNU gdb (GDB) 7.4.1-debian
    • gdb 文档不鼓励/m,而是建议/s:“/m 选项已弃用,因为当存在内联代码或重新排序的代码时,它的输出无用。/s选项是首选。这里是 AMD x86-64 的示例,显示 /m 输出和 /s 输出之间的区别。该示例在头文件中定义了一个内联函数,并且代码使用“-O2”优化编译. 请注意 /m 输出如何缺少 /s 输出中存在的几条指令的反汇编。” -- sourceware.org/gdb/current/onlinedocs/gdb/Machine-Code.html
    【解决方案3】:

    为了你的目的,试试

    objdump -S <your_object_file>
    

    来自人 objdump:

    -S
    --source
     Display source code intermixed with disassembly, if possible.
     Implies -d.
    

    【讨论】:

      【解决方案4】:

      最快的方法是在启动gdb后按下组合键ctrl-x 2

      这将立即为您提供一个拆分窗口,其中包含文本用户界面模式下的源代码和程序集(在接受的答案中描述)。

      另一个工具提示:此模式下的键盘箭头用于在源代码中上下导航,要使用它们访问命令历史记录,您可以使用ctrl-x o,它将重新聚焦在 gdb shell 窗口上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-24
        • 2015-08-08
        • 1970-01-01
        • 2018-05-07
        • 1970-01-01
        • 1970-01-01
        • 2013-04-20
        • 1970-01-01
        相关资源
        最近更新 更多