C gdb:将字符数组显示为大端短字符

C gdb:将字符数组显示为大端短字符,c,debugging,gdb,endianness,C,Debugging,Gdb,Endianness,假设我有一个数组 char foo[] = { 0, 1, 1, 0 }; 在gdb中,在x86机器上,如果我说 p (short[2])*foo 我明白了 也就是说,两个字节以小端顺序解释为短 是否有一种方便的方法(例如宏)使gdb将bytearray显示为big-endian-shorts(或任何类型)?使用。使用set endian auto切换回自动endian选择 (gdb) p (short[2])*foo $1 = {256, 1} (gdb) set endian big T

假设我有一个数组

char foo[] = { 0, 1, 1, 0 };
gdb
中,在x86机器上,如果我说

p (short[2])*foo
我明白了

也就是说,两个字节以小端顺序解释为

是否有一种方便的方法(例如宏)使
gdb
将bytearray显示为big-endian-shorts(或任何类型)?

使用。使用
set endian auto
切换回自动endian选择

(gdb) p (short[2])*foo
$1 = {256, 1}
(gdb) set endian big
The target is assumed to be big endian
(gdb) p (short[2])*foo
$2 = {1, 256}
(gdb) set endian auto
The target endianness is set automatically (currently little endian)
(gdb) p (short[2])*foo
$3 = {256, 1}
(gdb) 

检查表单了解有关设置目标程序的结束符的更多信息。然而,设置endian ness可以显示不同的
GDB
输出值,使调试的程序不受影响。来源:。很遗憾,这不起作用。虽然我可以说
p/d(short[2])*foo
很好,但在发出
set endian big
gdb后,它告诉我
当前上下文中没有符号“foo”。
这是gdb 7.5.1,顺便说一句。我没有完成上面的输出,它来自一个实际的
gdb
会话,使用了您提供的相同代码。我使用的是
gdb7.5.91
。我实际使用的代码更复杂,即指向分配内存区域的本地指针,不知何故,gdb似乎不再能够正确解释该指针,因此报告说它找不到symbol
foo
。这正是我要求使用宏或类似内容的原因(因为我在这里写问题之前已经尝试了endian设置)。如果在设置endian之前打印工作正常,请尝试执行
p(void*)&foo[0]
以获取指针值。然后在设置完endianess后,将地址本身强制转换为:
p/d(short[2])0xSOMETHNG
。唉,不管我怎么做,它都不起作用。根据您的建议,即使使用
set endian big
,我也会得到与
set endian little
完全相同的值。也许我的gdb版本真的有问题,因为你得到了工作结果。我最终会更新到最近的版本,然后重试。谢谢你的帮助!
(gdb) p (short[2])*foo
$1 = {256, 1}
(gdb) set endian big
The target is assumed to be big endian
(gdb) p (short[2])*foo
$2 = {1, 256}
(gdb) set endian auto
The target endianness is set automatically (currently little endian)
(gdb) p (short[2])*foo
$3 = {256, 1}
(gdb)