【问题标题】:Stepping through allocated executable memory in a .NET application单步执行 .NET 应用程序中分配的可执行内存
【发布时间】:2012-02-29 06:09:25
【问题描述】:

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

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

如何进入我在 .NET Visual Studio 项目中分配的可执行内存块中生成的本机函数?有什么能阻止这成为可能吗? (我没有选中“只是我的代码”选项)

【问题讨论】:

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


    【解决方案1】:

    您是否按照MSDN 中的说明设置了“启用非托管代码调试”?

    【讨论】:

    • 啊啊我希望我只是忘记了这样一个标志。由于某种原因,Visual Studio 仍然不会介入调用,但现在注入“int 3”断点可以工作,我可以从那里开始。这并不理想,但我应该能够以这种方式工作。谢谢!
    【解决方案2】:

    如果您真的在使用 HeapAlloc,我很惊讶这完全有效。我的印象是 HeapAlloc 分配的内存没有执行权限。我通常使用 VirtualAlloc 来分配这样的内存,并使用 VirtualProtect 显式设置执行标志。

    【讨论】:

    • HeapCreate 提供了一个 HEAP_CREATE_ENABLE_EXECUTE 标志(“在从堆运行代码的应用程序中使用此标志堆”)。我没有尝试使用 VirtualAlloc,但使用起来似乎更复杂。
    猜你喜欢
    • 1970-01-01
    • 2018-06-10
    • 2013-10-15
    • 2012-06-20
    • 2016-01-09
    • 2019-08-26
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    相关资源
    最近更新 更多