Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何打印Visual Studio跟踪点中的寄存器偏移?_C++_Visual Studio_Debugging_Assembly_Cpu Registers - Fatal编程技术网

C++ 如何打印Visual Studio跟踪点中的寄存器偏移?

C++ 如何打印Visual Studio跟踪点中的寄存器偏移?,c++,visual-studio,debugging,assembly,cpu-registers,C++,Visual Studio,Debugging,Assembly,Cpu Registers,我在一个我不拥有的函数(Windows'user32.dll的一部分)中使用Visual Studio,我想打印出函数的参数 如果我有函数的源代码,我可以使用以下语法 在从$CALLER调用的函数({arg1},{arg2})中 但是,我没有user32.dll的调试信息,因此无法引用arg1。在“监视”窗口中,我可以通过从寄存器偏移来查看变量(*(int*)(ESP+4)),但我不知道如何在跟踪点的“打印”选项中执行此操作 当我尝试以下方法时: 在函数({*(int*)($ESP+4)})中,

我在一个我不拥有的函数(Windows'
user32.dll
的一部分)中使用Visual Studio,我想打印出函数的参数

如果我有函数的源代码,我可以使用以下语法

在从$CALLER调用的函数({arg1},{arg2})中

但是,我没有
user32.dll的调试信息,因此无法引用
arg1
。在“监视”窗口中,我可以通过从寄存器偏移来查看变量(
*(int*)(ESP+4)
),但我不知道如何在跟踪点的“打印”选项中执行此操作

当我尝试以下方法时:

在函数({*(int*)($ESP+4)})中,{*(bool*)($ESP+8)})从$CALLER调用

我在从其他函数调用的函数(,)中得到:


如果这是可能的,有什么想法吗?

不确定在Visual Studio中是否可能。至少记录在案的追踪点的可能性似乎没有涵盖你所需要的

另一种解决方案是使用WinDbg(包含在中)。使用WinDbg,您可以:

bp kernel32!CreateFileW“du poi(@esp+4);gc”

此命令:

  • 在您感兴趣的函数上设置断点(bp
  • 在断点命中时,执行“”中的部分。这将打印出您感兴趣的参数并继续调试。例如,对于CreateFile示例:
  • du-打印(@esp+4)指向(poi)的地址处的unicode字符串

    gc-命令以用于命中断点的相同方式(单步执行、跟踪或自由执行)从条件断点恢复执行

    我希望这有帮助

    编辑:在阿萨夫·列维(Assaf Levy)现在被删除的回复之后(我想投赞成票,因为这有助于学习一些东西/促使我在VS:-)中再次尝试。不幸的是,他删除的速度比我投赞成票快

    我设法让CreateFile(filename)的跟踪工作与我在VisualStudio的WinDbg中的工作类似(我使用2010作为参考)。我所做的:

  • 在调试器中,我选择了“转到反汇编”,然后转到CreateFileW调用_CreateFileW@28)
  • 我进入断点窗口,选择New->Break at function…(Ctrl+B)。输入名称(_CreateFileW@28).我也尝试了WinDbg方式(内核32!CreateFileW),但它不起作用(不受支持?)
  • 在断点上选择“命中时…”并输入:“CreateFileW文件名:{*((const wchar_t**)(@esp+4))}”,选择继续执行
  • 现在我的测试代码如下:

    CreateFileW文件名:0x7efddc00“c:\Temp\test.out”

    为CreateFile调用打印

    因此,原则上,它在VS中也可以/应该可以工作。这需要一些技巧,但它可以工作


    EDIT2:另外,如果您设置“Microsoft符号服务器”的使用,可能会帮助/简化工作。请参阅:。它也可以在没有符号服务器的情况下工作,但在创建断点时,您必须调整步骤1并使用地址而不是符号名称。

    除非我遗漏了什么,否则这对我有效:
    在foo中:({*(int*)($ESP+4)},{*(int*)($ESP+8)})从$CALLER调用
    
    给我的正是我通过的两个整数。

    既然你已经编辑了你的问题,我想这不再是关于跟踪点的问题,而是关于如何调试系统代码的问题。@AssafLevy真的吗?我认为我没有做任何重大编辑,我想检查系统调用我的代码调用的内容(我没有在Win32中寻找bug)@莫蒂。请参阅我的最新编辑。也许你也应该设置对Microsoft symbol服务器的访问权限,并提供一个本地缓存目录。我发现它非常有用…它在开始时需要一些时间,直到它填满缓存。我感觉系统正在试图保护自己(例如,您不能使用/debug启动windows,也不能使用某些编解码器播放windows Media。我还发现Skype以该模式挂起系统:)@ds27680我正在使用MS的symbol服务器,我说了些什么让您觉得我不是吗?(否则我不可能将断点放在第一位)。谢谢
    @
    的工作(我试过使用
    $
    )。我看到@Assaf也使用了
    $
    ,我不知道为什么它对他有效(对我无效)。从莫蒂的版本来看,我认为它无关紧要,但如果它对某人有帮助,现在就取消删除:)
    @
    有一个很好的收获!给你。我向上投了一票作为承诺。谢谢你让我感到惊讶。嘿,我试过了,但它不起作用!让我再试一次……也许我错投了一些东西……嗯,我肯定是在我的VS2005中使用了
    $
    签名。我实际上对跟踪点没有什么经验,但你的问题是对我说。好的,可能是VS8和VS10之间的差异