C++ 如何打印Visual Studio跟踪点中的寄存器偏移?
我在一个我不拥有的函数(Windows'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)})中,
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之间的差异