在Linux 64位上,ptrace()可以返回双精度吗?

时间:2018-08-25 03:36:02

标签: linux debugging ptrace

假设addr是堆栈上的局部变量的地址,以下用于检索变量值的正确方法(ChildPid是Tracee的ID)吗?

double data = (double) ptrace(PTRACE_PEEKDATA, ChildPid, addr, 0);

float data = (float) ptrace(PTRACE_PEEKDATA, ChildPid, addr, 0);

谢谢。

2 个答案:

答案 0 :(得分:1)

文档说PTRACE_PEEKDATA返回一个单词。它还说

  

“字”的大小由操作系统变体确定(例如,对于32位Linux,它是32位)。

因此,在32位系统上,您无法可靠地使用单个ptrace()调用来获得双精度,而只有一半。另一半的地址可能取决于堆栈是向上还是向下。在64位系统上,您必须找出返回的单词的哪一半具有浮点数。

所以...这完全取决于您的工作。

答案 1 :(得分:0)

long投射到double并不会获得理想的结果。强制转换数字会转换数字值,不会复制位。您需要的是这样的东西:

long pt = ptrace(PTRACE_PEEKDATA, ChildPid, addr, 0);
double result;
assert (sizeof(pt) == sizeof(result), "Oops, wrong word size!");
memcpy (&result, &pt, sizeof(result));

要获取float,您需要知道它占单词的哪一半(通常不应该使用addr,它与单词边界不对齐)。因此,您需要以下内容:

long pt = ptrace(PTRACE_PEEKDATA, ChildPid, addr, 0);
float result;
assert (sizeof(pt) == 2*sizeof(result), "Oops, wrong word size!");
// either this (for the lower half of the word)
memcpy (&result, &pt, sizeof(result));
// or this (for the upper half of the word)
memcpy (&result, ((char*)&pt)+sizeof(result), sizeof(result));