[英]R.NET works with x86 but not x64
我正在嘗試在 R.NET 的教程頁面上構建和運行 Hello World 示例。 當我強制程序以 x86 模式運行時,它似乎沒問題。 但是,當我在 x64 中運行時,它很早就停止了消息,“[程序] 以代碼 1073740791 退出”我已經在R 項目中安裝了最新版本的 R 並運行了故障排除步驟。 我從故障排除程序中得到的 output 是:
我已經驗證有一個文件R.dll推斷它應該是“C:\Program Files\R\R-4.0.3\bin\x64”。 當我逐步使用我的反編譯器時,它似乎被 REngine.cs 中的第 400 行顯示在 function "Initialize" at this.GetFunction<setup_Rmainloop>()();
它似乎沒有拋出異常,它只是停止。 老實說 - 我不確定這條線應該做什么......
有什么想法嗎? 如果必須,我可以在 x86 模式下運行,但如果可能的話,我想使用 x64。
這個問題已經報告了一段時間了。我對 R-4.0.3 到 R-4.0.5 也有同樣的經歷。
R-4.0.2 和以前的版本(4.0.1、4.0.0、3.6、3.5)沒有這樣的問題
我已經對此進行了分析並跟蹤了其中一個 RDotNet GitHub 問題( https://github.com/rdotnet/rdotnet/issues/139#issuecomment-898699993 )中的發現。
這似乎與 Windows 10 中啟用的控制流防護安全功能有關。這在 R 程序本身中不會發生,因為它們是使用與 Microsoft 不同的編譯器(gcc via mingw)編譯的。 However, the CFG feature is enabled for .NET binaries and there is something (sorry, I don't know the actual underlying root cause) in a change within R 4.0.3 in setjmp
/ longjmp
calls that is causing the crash (see: https ://github.com/wch/r-source/blob/trunk/src/gnuwin32/fixed/h/psignal.h#L44-L51 )。
盡管您實際上會禁用安全功能,但我現在在編譯程序后修改程序時有一些運氣(您可以將其設置為構建后事件)。 您將需要運行類似: link /EDIT /GUARD:NO <yourapp>.exe
,它會禁用 CFG。
感謝https://github.com/dotnet/runtime/issues/11899#issuecomment-502195325提供了此解決方法所需的說明,以及https://www.trendmicro.com/en_us/research/1 -flow-guard-improvements-windows-10-anniversary-update.html提供了令人驚嘆的 CFG 分析,讓我們了解了正在發生的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.