2012-11-01 89 views
5

私がロードされたときにエラーを与えるにMinGW64コンパイルDLL(のpythonモジュール)を、持っている:に失敗しました:メモリロケーションへのアクセスが無効です

ImportError: DLL load failed: Invalid access to memory location 

をDLLのみ64ビットのライブラリにリンクされている(依存関係Walkerはそれを確認して)、デバッグシンボルを持っています。コードはかなり複雑なC++ 11(約30のソースファイル)ですが、私はそれを二分できません。私は正常にMinGW64で他のモジュールをコンパイルしてテストしましたが、ツールチェーンはうまく動作します。

SSE2命令(これらはhwでサポートされていますが、明示的に使用しません)またはまだ初期化されていないグローバル変数から読み取るコードでは、このエラーが報告されることがあります__attribute__((constructor))で機能しますが、それらはMinGW64でも正常に動作します。update:すべてのコンストラクタ関数を削除して、それが原因ではないことを確認しました。

エラーの原因はどこから分析されますか? - 明らかに、エラーがntdll.dllによってトラップされ、信号が発生するが、それがない

私は(ctypes.WinDLL(...)を使用して)デバッガでのDLLをロードすると、私は残念ながらGDBからだけ無意味なスタックトレースを取得する:私が試した何

エラーがどこから来たのかについてどのような更なるヒントを与える:私も、「Hello World」の実行ファイルとオブジェクトファイルをリンクさ

Program received signal SIGTRAP, Trace/breakpoint trap. 
0x0000000077c23522 in ntdll!ExpInterlockedPopEntrySListFault16() 
    from C:\Windows\system32\ntdll.dll 
(gdb) warning: HEAP[python.exe]: 
warning: Invalid address specified to RtlSizeHeap(00000000003B0000, 0000000002306830) 


(gdb) bt 
#0 0x0000000077c23522 in ntdll!ExpInterlockedPopEntrySListFault16() 
    from C:\Windows\system32\ntdll.dll 
#1 0x0000000077c0c241 in ntdll!RtlZeroHeap() 
    from C:\Windows\system32\ntdll.dll 
#2 0x0000000077c0c250 in ntdll!RtlZeroHeap() 
    from C:\Windows\system32\ntdll.dll 
#3 0x0000000077c3c130 in ntdll!LdrLoadAlternateResourceModuleEx() 
    from C:\Windows\system32\ntdll.dll 
#4 0x00000000003b0000 in ??() 
#5 0x0000000002306830 in ??() 
#6 0x00000000003b0000 in ??() 
#7 0x00000000792e21c0 in ??() 
#8 0x00000000003b0000 in ??() 
#9 0x0000000077c3c0ba in ntdll!LdrLoadAlternateResourceModuleEx() 
    from C:\Windows\system32\ntdll.dll 
#10 0xffffffffffffffff in ??() 
#11 0x0000000050000061 in ??() 
#12 0x0000000000000000 in ??() 

、すでにGDBがクラッシュした(それは私の実行可能です)Reading symbols from woomain.exeでファイルを開くとき:

gdb crash dialogue

+0

Eudoxos、実行時にのみ、本当に動的にdllにリンクしようとしましたか? [LoadLibraryEx](http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179%28v=vs.85%29.aspx)とそのフラグで再生します。あなたのexeは間違いなくデバッガで起動し、 'LoadLibraryEx'が明示的に呼び出されるより早く失敗します。 – Jarekczek

+0

@ Jarekczek:PythonでDLLを読み込むことは完全に動的です(これが最初のケースでした)。私は '.exe'ファイルに直接リンクしてみましたが、違いがあるかどうかだけを確認しました。 – eudoxos

+0

バグがデバッガをクラッシュさせるとかなり悲しいです。パドルなしであなたを小川の上に残す。あなたは別のパドルが必要です。 –

答えて

6

問題は、モジュールをコンパイルするときにPythonがMinGWよりも別のmsvcrtにリンクされていたことです。これはhttp://bugs.python.org/issue16472に報告されています。

0

これは正しい解決策ではない可能性があります。ちょっとしたヒント。 ImportError: DLL load failed: Invalid access to memory location. Cでプログラムされた独自のPython拡張を作成しようとしたときに同じエラーが発生しました。プラットフォーム:Windows 32ビット。

このエラーは、すべてのPython環境(Spyder、Notebook、plain console ...)でインタラクティブモードと非インタラクティブモードでランダムに表示されたため、本当に苦痛でした。私はMinGWとPythonのdistutils(コマンドpython setup.py install)を使って自分のコードをコンパイルしました。コンパイル時に警告やエラーが表示されず、pydファイルが正しいディレクトリに作成されました。しかし、このモジュールをインポートしようとすると、import example私のPythonコードは不規則にクラッシュしました(通常、モジュールをインポートする5回の試行のうち1回だけ成功しました)。

奇妙なことに、別のコンピュータではうまくいきました...まあ、最終的に回避策を見つけました。私はMinGWの新しいバージョンをダウンロードしてから(Qt SDKディストリビューションに同梱されているバージョンを使用していました)モジュールを再起動します。その後もクラッシュはなくなりました。しかし、私は体系的な解決法や説明を見つけられませんでした。だから私はpydファイルを生成するために使用されたコンパイラと関係があるかもしれません(おそらくDLLがないのでしょうか?正確にはわかりません)。

+0

ねえ、申し訳ありませんが、リンクされている別のランタイムで問題が見つかりました。私は私が以下の答えで提出したPythonの問題へのリンクを張った。私はmsvc *が使用されているdistutilsで手作業で変更し、私の問題を解決しました。 – eudoxos

0

インポートwin32apiの実行中に同じエラーが発生しました。インポートwin32apiを実行する前にインポートしたctypesだけでしたが、エラーはありませんでした。

関連する問題