gpt4 book ai didi

c - 在调试期间将十六进制解释为字符串

转载 作者:行者123 更新时间:2023-11-30 14:36:55 26 4
gpt4 key购买 nike

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

考虑这个例子

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

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

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

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

最佳答案

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

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

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

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

此外,据我所知,反汇编代码中的字符串与您上面发布的代码片段不一致,它是 48656c6c6f32 =Hello2 .

<小时/>

相反,如果你要做这样的事情:

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

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

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

允许您做x/s <address>查看其内容。

关于c - 在调试期间将十六进制解释为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57750162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com