如何获取 gdb tui 程序集输出以显示指令?
Posted
技术标签:
【中文标题】如何获取 gdb tui 程序集输出以显示指令?【英文标题】:How to get gdb tui assembly output to show instruction? 【发布时间】:2013-06-05 00:48:30 【问题描述】:我想查看程序集输出,但发现在 TUI 中,它会输出 function signature + offset:
,这很酷,除了我使用 C++ 编程并且函数签名已完全解析,因此我得到了命名空间和模板使函数 sig 2 行或更多行长的参数。这当然会在 TUI 中被截断,因此它甚至不会显示汇编指令。
有没有办法缩短、更改前缀(可能是文件/行格式)或根本不将此前缀输出到汇编指令?
【问题讨论】:
未经测试的选项,因此不是答案:尝试set print max-symbolic-offset
使用一些值,因此 gdb 大多不会输出符号名称。或者尝试set print asm-demangle off
print asm-demangle
已经关闭。尽管print max-symbolic-offset
很有趣,因为我可以删除几乎所有function signature+offset:
前缀,但很难将汇编指令与行匹配。使用file:line
或file:line+offset
前缀会更好。
【参考方案1】:
虽然目前无法截断此前缀,但解决方法是使用 focus asm
命令(如果 asm 窗口不是焦点)将焦点设置到程序集窗口,然后使用right arrow key
,您可以向右滚动窗口,最终将显示程序集输出。
注意:
这是一种解决方法,但仍然存在问题,因为当您步进或滚动CMD
窗口时,它会迅速回到第一列。此外,似乎当您执行next
命令时,当前命令的整个前缀及其汇编代码会显示在 ASM 窗口中(即它不会被截断),环绕屏幕,干扰显示。虽然很烦人,但可以使用Ctrl-L
刷新屏幕来解决此问题。
另外,上下滚动ASM
窗口实际上会导致调试器崩溃。这可能是由缓冲区溢出引起的,因此不建议这样做,并且仅在需要时才显示程序集窗口并在不需要时隐藏它可能会更好。
hasturkun 建议的另一个解决方法选项是 set print max-symbolic-offset N
(you will have to scroll down to find it's description),它告诉 “gdb 仅在最近的较早符号和地址之间的偏移量小于时才显示地址的符号形式” N. 将 N 设置为 1 会删除大部分前缀,但会让您猜测哪个指令与哪个源代码行匹配。
【讨论】:
我已经向 bugzilla here 添加了一个错误/功能请求。【参考方案2】:我不相信有办法。
我认为这对于 bugzilla 来说是一个合理的功能请求,但请注意 TUI 并没有得到太多的喜爱。
【讨论】:
我的意思是没有人在做常规工作。它似乎有一些用户,只是没有开发人员。以上是关于如何获取 gdb tui 程序集输出以显示指令?的主要内容,如果未能解决你的问题,请参考以下文章