假设addr
是堆栈上的局部变量的地址,以下用于检索变量值的正确方法(ChildPid是Tracee的ID)吗?
double data = (double) ptrace(PTRACE_PEEKDATA, ChildPid, addr, 0);
float data = (float) ptrace(PTRACE_PEEKDATA, ChildPid, addr, 0);
谢谢。
答案 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));