【问题标题】:Interpret hexadecimal as string during debugging在调试期间将十六进制解释为字符串
【发布时间】:2020-01-05 02:10:34
【问题描述】:

我想在调试期间将十六进制值解释为字符串,以便我知道存储的内容。我不知道该命令是什么,因此非常感谢任何帮助。

考虑这个例子

#include <stdio.h>
#include <string.h>

int main(){
  char str_b[] = "Hello";
  printf("%s",str_b);
  return 0;
}

当我反汇编主要方法时,我得到以下

现在,如何使用 gdb 将第 4 行解释为字符串?我尝试了s 命令,但它对我不起作用。

【问题讨论】:

  • Seeing register contents in ASCII in gdb 中,我回答了一个gdb 宏,它可以用ASCII 打印寄存器的内容,但它适用于任何类型的值,在你的情况下是asciiprint (int)0x6c6c6548

标签: c string gdb hex


【解决方案1】:

嗯,在这种特殊情况下,这些是立即值的移动,因此字符串实际上是代码的一部分。您的字符串被分成两条mov 指令(加上一条用于终止\0 字节)。

(部分)看到它的一种方法是x/10s 0x113d(这里 10 只是一个任意数字),这会在指令中间打印您的字符串。

另一种方法是在最后一次移动后立即停止并从堆栈中打印其值,如下所示:

(gdb) break *0x114a
(gdb) run
Breakpoint 1, 0x000000000000114a in main ()
(gdb) ni
(gdb) x/s $rbp-0x27
0xXXXX: "Hello"

另外,据我所见,您在反汇编代码中的字符串与您在上面发布的 sn-p 不一致,它是 48656c6c6f32 = Hello2


相反,如果您要执行以下操作:

int main(void) {
    char *s = "Hello";
    puts(s);
}

字符串将存储在只读数据部分中,您会看到存储字符串的特定地址的加载,如下所示:

lea rdi, [<address>]
call <puts>

让你x/s &lt;address&gt;查看其内容。

【讨论】:

  • 我知道它是我的代码的一部分。我也知道,在我的字符串存储在那里之后,我可以使用 x/s 访问内存地址以查看它的内容。有没有办法在调试期间以某种方式将十六进制数评估为字符串,以便在字符串存储在某处之前对其进行评估?
  • @OkiDoki 不,不幸的是,没有办法做到这一点,gdb 没有。
  • 嗯,好的,谢谢。这确实很不幸。不过感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2015-08-02
  • 1970-01-01
  • 2018-01-22
  • 2019-07-27
  • 1970-01-01
相关资源
最近更新 更多