首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在gdb中处理`__int128`?

如何在gdb中处理`__int128`?
EN

Stack Overflow用户
提问于 2018-05-13 20:12:43
回答 2查看 1.2K关注 0票数 5

我目前正在努力与gdb处理gcc特定类型的__int128在gdb内。我设法做了一些实时计算,例如:

代码语言:javascript
复制
(gdb) p /x (__int128) (1 << (8 * 8))
$1 = 0x00000000000000000000000000000001
(gdb) ptype bitmask
type = const __int128 unsigned

但是,每当我试图计算的表达式变得更加复杂时,我就会得到:

代码语言:javascript
复制
(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.

那么,有什么方法可以在gdb中的__int128上评估这样的表达式吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-14 00:42:34

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

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

下面是一个示例shell会话,展示了在GDB中如何处理这种特定于编译器的类型:

代码语言:javascript
复制
$ 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,结果(有点)清晰:

代码语言:javascript
复制
$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值一起工作的算术例程中链接以帮助调试,因此您可以使用GDB中的call negate128 (value)来获得C表达式-value的结果,其中value具有__int128类型。也不需要进行溢出检查,因为机器会像处理其他类型的那样为您处理这个问题,所以继续编写类似的内容(假设您使用的是溢出不会杀死您的程序或整个机器的系统):

代码语言:javascript
复制
__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; }
票数 4
EN

Stack Overflow用户

发布于 2018-05-13 22:54:08

那么,是否有一种方法可以在gdb中的128上计算这种表达式?

不是直接的,但是您可以使用内置python (它的无限精度)来实现某种等价的结果:

代码语言:javascript
复制
(gdb) py print('0x%x' % ((1 << (8 * 8)) - 1))
0xffffffffffffffff

(gdb) py print('0x%x' % ((1 << (8 * 8 + 5)) + 1))
0x200000000000000001
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50320244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档