GDB:直到命令停止在哪里?

Posted

技术标签:

【中文标题】GDB:直到命令停止在哪里?【英文标题】:GDB: until command stops where? 【发布时间】:2020-03-10 19:16:00 【问题描述】:

在gdb和disas命令中运行程序后:

   0x0000555555556692 <+0>:  sub    $0x18,%rsp
   0x0000555555556696 <+4>:  mov    %0x28,%rax
   0x00005555555566da <+13>: jmpq   *%rax

如果我使用

(gdb) until *0x000055555555669f

第 行,是执行第 13 行然后停止还是只执行第 4 行然后停止?

【问题讨论】:

你试过了吗? print /x $pc 显示什么?这将告诉您 JMP 是否已经执行并更新了程序计数器 (RIP)。使用 RAX 中的有效地址进行测试也许也很有用,因此从新 RIP 中提取代码不会出错。另外,你确定这是真正的输出吗? 0x...6960x...6da 的地址间隔超过 9 个字节,mov %0x28,%rax 不是有效的 AT&T 语法。 $0x28 mov-immediate 将是 7 或 10 个字节长,而不是 9,除非您以某种方式使用冗余前缀手动编码符号扩展 imm32 版本。 是的,你是对的。那不是真正的输出。我只是为了这个问题而编造地址。我试过了,看起来直到 [在此处输入地址] 命令不会执行地址处的语句。参数中指定。它只会执行它之前的语句,所以只有。如果我错了,请纠正我。 等一下,你的问题声称0x000055555555669f&lt;+13&gt; 行,但它在假反汇编中有不同的地址。如果您要编造一些东西,或者更好地构建一个真实的测试用例并组装它,至少让您的问题自洽,然后复制/粘贴 GDB 输出。 (包括您尝试时发生的事情)。起初我没有注意到该文本,并认为您在询问until 地址位于指令中间某处或分支目标之类的情况。 【参考方案1】:

gdb 在执行中断的指令之前总是会中断。

【讨论】:

以上是关于GDB:直到命令停止在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

gdb可以跟踪内存分配日志

GDB主要命令

GDB 程序调试常用命令

GDB远程调试:无法停止线程

gdb 使用啥机制来知道在哪里“完成”函数调用?

GDB scheduler-locking 命令详解