gpt4 book ai didi

c - 如何处理gdb中的 `__int128`?

转载 作者:行者123 更新时间:2023-12-01 10:21:59 32 4
gpt4 key购买 nike

我目前正在努力使用 gdb 来处理特定于 gcc 的类型 __int128在 gdb 内。我设法进行了一些即时计算,例如:

(gdb) p /x (__int128) (1 << (8 * 8))
$1 = 0x00000000000000000000000000000001
(gdb) ptype bitmask
type = const __int128 unsigned

但是,每次我尝试评估的表达式变得更复杂时,我都会得到:
(gdb) p /x ((((__int128) 1) << (8 * 8)) - 1)
That operation is not available on integers of more than 8 bytes.
(gdb) p /x (__int128) 0xfffffffffffffffffffffffff
Numeric constant too large.

那么,有没有办法在 __int128 上评估这样的表达式?在 gdb 内?

最佳答案

如果你只需要打印一个常量值,py print(expr128)由于 Python 的任意整数精度,idea 非常有效。

但是,如果您需要使用类型为 __int128 的实际 C 变量。 ,您需要暂时将其转换为类似 unsigned long long[2] 的内容在 GDB 中对其执行操作,但请记住,您正在使用 2 个 64 位值的数组,因此 X[0] << 64不会像真正的 128 位 __int128 那样工作类型。 GDB 可以打印值;它只是不能操纵它的位。 GCC 允许你操作它的位;您的 libc 无法使用 printf 打印值甚至可能没有任何特定于 GCC 的代码允许它这样做。

这是一个示例 shell session ,显示了在 GDB 中使用这种特定于编译器的类型是多么麻烦:

$ nl bar.c
1 int main(void)
2 {
3 __int128 v = 1;
4 v <<= 62;
5 v <<= 2;
6 }
$ gcc -g -o bar bar.c
$ gdb -q ./bar
Reading symbols from ./bar...done.
(gdb) break 5
Breakpoint 1 at 0x5e8: file bar.c, line 5.
(gdb) run
Starting program: /home/luser/bar

Breakpoint 1, main () at bar.c:5
5 v <<= 2;
(gdb) print/x *(long long(*)[2])&v
$1 = {0x4000000000000000, 0x0}
(gdb) print/x (*(long long(*)[2])&v)[0]+1
$2 = {0x4000000000000001, 0x0}
(gdb) next
6 }
(gdb) print/x *(long long(*)[2])&v
$3 = {0x0, 0x1}
(gdb) print/x (*(long long(*)[2])&v)[0]+1
$4 = {0x1, 0x1}

考虑到我机器的小端 CPU,结果(有点)清楚:

$1 = 0x0000 0000 0000 0000
4000 0000 0000 0000 # 1<<62
$2 = 0x0000 0000 0000 0000
4000 0000 0000 0001 #(1<<62) + 1
$3 = 0x0000 0000 0000 0001
0000 0000 0000 0000 # 1<<64
$4 = 0x0000 0000 0000 0001
0000 0000 0000 0001 #(1<<64) + 1

有了这么大的值,即使是十六进制也变得有点麻烦,但您明白了:在 GDB 中使用这些值可能会遇到需要处理的所有括号的问题,而且您需要保留目标机器的在操作值以及跟踪溢出时要记住字节序。

我的建议:链接一些适用于 __int128 的算术例程值来帮助调试,所以你可以使用类似 call negate128 (value) 的东西在 GDB 中获取 C 表达式的结果 -value哪里 value有类型 __int128 .也不需要溢出检查,因为机器会像处理任何其他类型一样为你处理,所以继续写这样的东西(假设你正在使用一个溢出不会杀死你的程序或整个程序的系统机器):

__int128 add128(__int128 a, __int128 b) { return a + b; }
__int128 sub128(__int128 a, __int128 b) { return a - b; }
__int128 shl128(__int128 a, int n) { return a << n; }
__int128 shr128(__int128 a, int n) { return a >> n; }

关于c - 如何处理gdb中的 `__int128`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50320244/

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