gdb:强制转换取决于编译的语言

Sto*_*ogy 5 gdb

我正在调试使用 GDB (arm-none-eabi-gdb) 在 Rust 中编译的程序。有一次,我想写入一个内存地址,如下所示:

(gdb) set *((int *) 0x24040000) = 0x0000CAFE
syntax error in expression, near `) 0x24040000) = 0x0000CAFE'.
Run Code Online (Sandbox Code Playgroud)

经过多次尝试,我发现我正在转换 C 风格,我必须将其转换为 Rust 风格,如下所示:

set *(0x24040000 as *mut i32) = 0x0000CAFE
Run Code Online (Sandbox Code Playgroud)

我的问题是 GDB 如何解释不同的命令以及为什么会出现此错误。是不是因为符号(int)无法识别,但是在这种情况下,gdb如何加载符号?gdb 是否需要将指令编译为目标上运行的二进制文件的正确语言?

Lig*_*ica 2

是的,这取决于语言,并且语言是从加载的源文件的文件名推断出来的。

\n\n
\n\n

引用手册:

\n\n
\n

print和许多其他 GDB 命令接受表达式并计算其值。您所使用的编程语言定义的任何类型的常量、变量或运算符在 GDB 的表达式中都是有效的。这包括条件表达式、函数调用、强制转换和字符串常量。

\n
\n\n

和:

\n\n
\n

如果您不想查看分配的值,请使用set命令而不是命令print。set实际上与 相同,print只是表达式\xe2\x80\x99s 值未打印且未放入值历史记录中(请参阅值历史记录)。仅评估表达式的效果。

\n
\n\n

和:

\n\n
\n

对于某些语言,GDB 中内置了特定于语言的信息,允许您在程序\xe2\x80\x99 的本机语言中表达类似上面的操作,并允许 GDB 以与程序语法一致的方式输出值\xe2 \x80\x99 的母语。用于构建表达式的语言称为工作语言。

\n
\n\n

和:

\n\n
\n

控制工作语言\xe2\x80\x94有两种方法,要么让GDB自动设置,要么自己手动选择。您可以使用设置语言命令来达到任一目的。启动时,GDB 默认自动设置语言。

\n\n

[..]大多数情况下,GDB 从文件名推断语言。

\n
\n