Gdb 以十六进制打印长值而不必猜测长度
Gdb printing long values in hex without having to guess the length
如何在 gdb 中打印长值?
当仅使用 x
,即 x $rdi
时,值(十六进制)在 8 个字节后被截断。
如果我使用 x/32bx
(或任何其他长度),字节由空格分隔,这不太好,但没关系。问题是当我想打印一些长值时,我必须猜测大小并将它传递给 x/
。如果那个值是 256 字节长,输出看起来会很乱,因为它是用空格分隔的,但这也意味着我必须做很多猜测,然后通过一串又长又难看的字节来查找值所在的位置结束并后跟 0x00s(显然值之间可以有 0x00s,这使得尝试解决这个问题更加混乱)以便能够知道它有多长。
如果我尝试将其打印为整数,它也会被截断。我希望能够轻松判断一个值的长度而不是将其截断。
显示长值(以及 ll 和 ull)值的一种方法是使用 g 修饰符。例如,如果我们有一个程序只存储
unsigned long long int a = 1234567891234567898;
int b = 23;
unsigned long long int c = 1111111111111111111;
通过键入 x/20xg $rsp(在值被移动到堆栈之后)我们得到
0x7fffffffdd90: 0x0000000000000000 0x0000001755555040
0x7fffffffdda0: 0x112210f4c023b6da 0x0f6b75ab2bc471c7
0x7fffffffddb0: 0x0000000000000000 0x00007ffff7e08b25
...
[rsp+0x10]和[rsp+0x18]中的长数分别为a和c,[rsp+0xc]中的0x17为b。
如何在 gdb 中打印长值?
当仅使用 x
,即 x $rdi
时,值(十六进制)在 8 个字节后被截断。
如果我使用 x/32bx
(或任何其他长度),字节由空格分隔,这不太好,但没关系。问题是当我想打印一些长值时,我必须猜测大小并将它传递给 x/
。如果那个值是 256 字节长,输出看起来会很乱,因为它是用空格分隔的,但这也意味着我必须做很多猜测,然后通过一串又长又难看的字节来查找值所在的位置结束并后跟 0x00s(显然值之间可以有 0x00s,这使得尝试解决这个问题更加混乱)以便能够知道它有多长。
如果我尝试将其打印为整数,它也会被截断。我希望能够轻松判断一个值的长度而不是将其截断。
显示长值(以及 ll 和 ull)值的一种方法是使用 g 修饰符。例如,如果我们有一个程序只存储
unsigned long long int a = 1234567891234567898;
int b = 23;
unsigned long long int c = 1111111111111111111;
通过键入 x/20xg $rsp(在值被移动到堆栈之后)我们得到
0x7fffffffdd90: 0x0000000000000000 0x0000001755555040
0x7fffffffdda0: 0x112210f4c023b6da 0x0f6b75ab2bc471c7
0x7fffffffddb0: 0x0000000000000000 0x00007ffff7e08b25
...
[rsp+0x10]和[rsp+0x18]中的长数分别为a和c,[rsp+0xc]中的0x17为b。