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

时间:2011-12-01 07:34:38

标签: c++ visual-studio debugging assembly cpu-registers

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

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

  

在$ CALLER

中调用的函数({arg1},{arg2})

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

当我尝试以下操作时:

  

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

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

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

2 个答案:

答案 0 :(得分:2)

不确定在Visual Studio中是否可以这样做。至少记录在轨迹点的可能性似乎没有涵盖你需要的东西。

一种替代解决方案是使用WinDbg(包括在Debugging Tools for Windows中。例如,使用WinDbg可以:

  

bp kernel32!Cre​​ateFileW“du poi(@ esp + 4); gc”

此命令:

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

    gc - 命令从条件断点恢复执行,其方式与用于命中断点的步骤相同(步进,跟踪或自由执行)。

    我希望这会有所帮助。

    编辑跟随Assaf Levy现在删除的回复(我想投票,因为它有助于学习一些东西/让我在VS中再次尝试它:-)。不幸的是,他删除的速度比我投票时更快。

    我设法跟踪CreateFile(文件名)的跟踪,就像我在Visual Studio中的WinDbg中所做的那样(参考我使用2010)。我做了什么:

    1. 我在调试器中选择了“Go to disassembly”,然后进入CreateFileW调用。我从那里取了函数的名称(即_CreateFileW @ 28)。
    2. 我进入了断点窗口,选择了New - >中断功能......(Ctrl + B)。输入名称(_CreateFileW @ 28)。我也尝试了WinDbg方式(kernel32!Cre​​ateFileW)但它不起作用(不支持?)
    3. 在断点上选择“When hit ...”并输入:“CreateFileW FileName:{*((const wchar_t **)(@ esp + 4))}”,选择继续执行。
    4. 现在使用我的测试代码,有以下几行:

      CreateFileW FileName:0x7efddc00“c:\ Temp \ test.out”

      打印

      以进行CreateFile调用。

      所以原则上它也适用于VS.这需要一些摆弄,但它确实有效。

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

答案 1 :(得分:2)

除非我遗漏了什么,否则这对我有用:
In foo: ({*(int*)($ESP+4)},{*(int*)($ESP+8)}) called from $CALLER
给我正好通过的两个int。