我在一个我不拥有的函数中使用Visual Studio trace point(Windows user32.dll
的一部分),我想打印出函数的参数。
如果我有该函数的源代码,我可以使用以下语法。
在$ CALLER
中调用的函数({arg1},{arg2})
但是,我没有user32.dll
的调试信息,因此我无法引用arg1
。在监视窗口中,我能够通过从寄存器(*(int*)(ESP+4)
)偏移来查看变量,但我无法弄清楚如何在跟踪点的打印选项中执行此操作。
当我尝试以下操作时:
在函数({*(int *)($ ESP + 4)},{*(bool *)($ ESP + 8)})中调用$ CALLER
我得到:在从OtherFunction调用的函数(,)中
如果有可能,有什么想法吗?
答案 0 :(得分:2)
不确定在Visual Studio中是否可以这样做。至少记录在轨迹点的可能性似乎没有涵盖你需要的东西。
一种替代解决方案是使用WinDbg(包括在Debugging Tools for Windows中。例如,使用WinDbg可以:
bp kernel32!CreateFileW“du poi(@ esp + 4); gc”
此命令:
du - 在指向( poi )的地址打印出unicode字符串(@ esp + 4)
gc - 命令从条件断点恢复执行,其方式与用于命中断点的步骤相同(步进,跟踪或自由执行)。
我希望这会有所帮助。
编辑跟随Assaf Levy现在删除的回复(我想投票,因为它有助于学习一些东西/让我在VS中再次尝试它:-)。不幸的是,他删除的速度比我投票时更快。
我设法跟踪CreateFile(文件名)的跟踪,就像我在Visual Studio中的WinDbg中所做的那样(参考我使用2010)。我做了什么:
现在使用我的测试代码,有以下几行:
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。