【问题标题】:Dereferencing pointers stored in registers (visual studio)取消引用存储在寄存器中的指针(Visual Studio)
【发布时间】:2016-07-14 18:55:37
【问题描述】:

我正在调试一个应用程序,需要查看存储在rcx 中的值所指向的内存区域。通常,对于代码,这将通过选择变量(指针)并添加快速监视以及从指针开始要监视的元素数量来完成:

我想在下面的代码中获取指向rcx 中移动的字符串的指针:

#include <stdio.h>

int main() {
000000013F1217C0  push        rbp  
000000013F1217C2  push        rdi  
000000013F1217C3  sub         rsp,0E8h  
000000013F1217CA  lea         rbp,[rsp+20h]  
000000013F1217CF  mov         rdi,rsp  
000000013F1217D2  mov         ecx,3Ah  
000000013F1217D7  mov         eax,0CCCCCCCCh  
000000013F1217DC  rep stos    dword ptr [rdi]  
    goto mylabel;
000000013F1217DE  jmp         $mylabel (013F1217EEh)  
000000013F1217E0  jmp         $mylabel (013F1217EEh)  
    printf("Skipped\n");
000000013F1217E2  lea         rcx,[string "Skipped\n" (013F129C28h)]  
000000013F1217E9  call        printf (013F1211CCh)  
mylabel:
    printf("goto ftw!\n");
000000013F1217EE  lea         rcx,[string "goto ftw!\n" (013F129C38h)]  
000000013F1217F5  call        printf (013F1211CCh)  
    return 0xf00d;
000000013F1217FA  mov         eax,0F00Dh  
}
000000013F1217FF  lea         rsp,[rbp+0C8h]  
000000013F121806  pop         rdi  
000000013F121807  pop         rbp  
000000013F121808  ret  

如何获取 rcx 指向的值?在汇编中,语法是:

[rcx+index]

但是我如何在 Visual Studio 中查看价值?

我已经尝试添加:

[rcx]
[rcx],10
rcx,10

在 QuickWatch 中,但我得到的前两个条目:

类型名称不允许

最后我不能取消引用rcx,它和以前一样显示。

编辑:

rcx 中的值转换为所需的类型,有效。在上述情况下,将在(char*)rcx 上添加一个快速监视,在调试窗口中显示整个字符串。对于其他类型(即整数),还需要在手表中指定元素的数量,否则只显示第一个值。例如,(int*)rcx, 10 显示从存储在rcx 中的地址值开始的 10 个四字节整数。必须为寄存器中存储的每个数据调整类型。

【问题讨论】:

  • 我以前没有用寄存器做过这个,只是简单地将值转换为你想要检查它的类型,因为它应该可以做到这一点 - 例如(char*)rcx
  • 这行得通,但是每次取消引用的数据类型发生变化时都必须对其进行修改。

标签: c++ c visual-studio pointers cpu-registers


【解决方案1】:

使用 _asm{....} 将寄存器的值复制到 c/c++ 指针,然后照常观看。 在这里您可以找到如何从内联汇编访问 c 变量: https://msdn.microsoft.com/en-us/library/fabdxz08.aspx

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
相关资源
最近更新 更多