逐步执行.NET应用程序中分配的可执行内存

时间:2012-02-07 19:33:19

标签: visual-studio-2010 debugging jit .net-assembly

我正在使用C#生成本机代码。我正在使用HeapCreateHeapAlloc来分配我编写x86-64指令的可执行内存。然后我使用Marshal.GetDelegateForFunctionPointer将其转换为.NET委托并调用它。我能够正确地创建并调用一个返回常量值的简单函数。

问题是我无法在VS2010中进入该功能。当我在调用操作码的反汇编窗口中使用“step into”时,它只是单步执行并且我永远不会看到反汇编的函数。我已经尝试在反汇编窗口中浏览到我的可执行内存地址或在该地址添加断点,但Visual Studio抱怨内存不可执行。我也尝试生成一个“int 3”指令,但它只会导致我的应用程序在没有警告的情况下退出(就像调用Environment.Exit一样)。我用C ++做了一个简单的测试程序,它使用相同的技术生成一个函数并调用它,我可以毫无问题地进入它。

如何进入我在.NET Visual Studio项目中分配的可执行内存块中生成的本机函数?有什么阻止这种情况发生吗? (我已经取消选中'只是我的代码'选项)

2 个答案:

答案 0 :(得分:1)

您是否按照MSDN

中的说明设置了“启用非托管代码调试”

答案 1 :(得分:1)

如果你真的使用HeapAlloc,我很惊讶这一点起作用了。我的印象是HeapAlloc分配的内存没有执行权限。我通常使用VirtualAlloc来分配这样的内存,并使用VirtualProtect显式设置执行标志。