【问题标题】:GDB TUI: Scroll assembly view above current instruction?GDB TUI:在当前指令上方滚动汇编视图?
【发布时间】:2014-12-21 18:15:13
【问题描述】:

我最近才开始使用 GDB,但我对它印象非常深刻。难怪它是许多用户事实上的调试器。不过,我发现的一个小烦恼是,我发现自己无法滚动到 TUI 程序集视图中的当前指令上方。只要显示缓冲区位于当前指令下方,我就可以上下滚动。

除了x/20i [address](这会破坏可滚动窗口的目的)或通过跳转改变内存并设置后续断点之外,还有什么方法可以告诉 TUI 程序集视图查看另一个位置可能高于(低于)当前指令?

编辑:这似乎只在附加到已经运行的进程时发生,而不是在使用 gdb 启动进程时发生。有时我可以向上滚动到当前指令,有时我不能全部向上滚动。

【问题讨论】:

  • 缺少任何其他答案,您可以考虑使用 gdb 前端之一,这将允许您滚动反汇编(除其他外)。见这里:sourceware.org/gdb/wiki/GDB%20Front%20Ends
  • 谢谢!使用cgdb 解决了我的问题!
  • 我已经为此提出了一个问题,因为它让我发疯:sourceware.org/bugzilla/show_bug.cgi?id=26024
  • 备注:上面链接的错误指出该错误发生在程序使用 SIGSEGV 崩溃时,并且该错误已在 gdb 10 中修复,因此可以选择升级。

标签: assembly gdb


【解决方案1】:

正如您所解释的,gdb tui 中的滚动程序集似乎存在某种问题,但存在一个简单的解决方法。

所以,首先通过按 ctrl+x ctrl+a 启用 tui 和反汇编视图。然后通过输入 layout asm 或类似的东西显示反汇编视图。

现在windows应该可以让你用键或鼠标滚动,但如果它停止(对我来说有时发生在某些功能的开头)输入通常的反汇编命令,反汇编视图将更新到该位置。

例子:

disass main
解除0x1234

【讨论】:

  • 我想它会起作用的。唯一的问题是“反汇编”命令不适用于这个特定的二进制文件——没有调试符号。感谢您的意见!
  • 我猜这是因为指令的长度(以字节为单位)是可变的——因此“向后”反汇编需要它“猜测”前一条指令的字节数。跨度>
  • 你可以使用 x/i 代替“反汇编”。
  • 即使没有调试符号,您也可以执行 dis $pc-50, $pc+50 之类的操作
  • 对我不起作用 =( disass 抱怨给定地址的功能缺乏。
【解决方案2】:

我发现了一个小技巧。如果您处于layout asm 模式并且无法滚动到当前指令,您可以执行命令layout split,然后执行layout asm,第一行将是当前指令。

【讨论】:

  • IIRC,frame 0 如果您向下滚动并且无法向上滚动,是否可以返回当前指令?不幸的是,如果不在带有符号的函数内,GDB 不会像当前 RIP 那样滚动回已知起点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多