私は、Windows-7-64PCのVisualStudio 2015(IDEを使用)でWinAPIアプリケーションの開発に成功しています。私は通常、リリースモードでプログラムをテストします。
次に、ソースを編集しました。プログラムはエラーなしでコンパイルおよびリンクされましたが、プログラムが期待どおりに動作しなかったため、デバッグモードに切り替えて、ビルドして実行しようとしました。再びVSはエラーなしでコンパイルおよびリンクされましたが、その後不平を言いました
「プログラム 'f:\ dropbox \ blah \ x64 \ Debug \ xxx.exe'を起動できません。'f:\ dropbox \ blah \ x64 \ Debug \ xxx.exe 'は有効なWin32アプリケーションではありません。」
変だと思ったので、リリースモードに戻ってもう一度試してみました。プログラムは正常に起動しました。私はいくつかの編集を行い、数回再構築しましたが、後でVSが宣言しました
「プログラム 'f:\ dropbox \ blah \ x64 \ Release \ xxx.exe'を起動できません。'f:\ dropbox \ blah \ x64 \ Release \ xxx.exe 'は有効なWin32アプリケーションではありません。」
私はすべてをきれいにし、VSを再起動し、PCを再起動しました。しかし、まったく役に立たなかったのですが、それでもまったく同じエラーが発生します。
編集:同様のレポートについて読んだ後、Dropboxの同期を一時停止してみました。その後、動作しているように見えましたが、1回か2回しか動作せず、問題が再発しました。次に、マルチプロセッサコンパイルをオフにしてみましたが、これにより、プログラムのリリースバージョンを再度実行できるようになりました。それ以来、私は問題なく何度も(50回以上?)編集-再構築-実行しましたが、それでもデバッグバージョンの実行を拒否します。
編集:参考までに私のウイルス対策ソフトウェアはMicrosoft SecurityEssentialsです
編集: dumpbinを呼び出してmy(実行されていないdebug exe)を渡すと、次の出力が生成されます。
File Type: EXECUTABLE IMAGE
Summary
1000 .00cfg
77BB8000 .data
1000 .gfids
4000 .idata
4000 .pdata
31000 .rdata
4000 .reloc
1000 .rsrc
DD000 .text
編集:ドロップボックスを介してリンクされ、まったく同じ症状を持つ別のマシン(windows-10-64)でcompile-build-runを試してみました。つまり、リリースモードで実行されますが、デバッグモードでは実行されません。
編集: Michael Burrのアドバイスで、(動作していない)デバッグexeでdependency Walkerを実行すると、これらのエラーが報告されました。好奇心から、dep-walkerが自分の(動作している)について言ったことを確認したいと思いました。 exeをリリースすると、まったく同じエラーのリストが表示されることがわかりました!...さらに検索すると、このSOの質問が見つかりました。「要点:他の誰かが述べたように、ツールは今では少し古くなっています。また、新しいOSでは常に正しく動作するとは限りません。したがって、目を離さず、「API-MS-WIN-CORE-COM-L1-1-0.DLL」がないことで誤解を招くことはありません...問題はおそらくあります完全に他の場所です。」
編集:下の画像の左側にある選択ボックスからデバッグモードとリリースモードを切り替え、緑色の三角形をクリックしてプログラムを実行します。
編集:デバッグexe用のマップファイルを生成しました。ここに表示するには大きすぎますが、次の行から始まります...
Timestamp is 5811bed3 (Thu Oct 27 09:46:11 2016)
Preferred load address is 0000000140000000
Start Length Name Class
0001:00000000 00002840H .text$di CODE
0001:00002840 000da860H .text$mn CODE
0001:000dd0a0 00001020H .text$mn$00 CODE
0001:000de0c0 00001eb0H .text$x CODE
0001:000dff70 0000104bH .text$yd CODE
0002:00000000 00000110H .CRT$XCA DATA
0002:00000110 00000110H .CRT$XCAA DATA
0002:00000220 00000110H .CRT$XCL DATA
0002:00000330 00000128H .CRT$XCU DATA
0002:00000458 00000110H .CRT$XCZ DATA
0002:00000568 00000110H .CRT$XIA DATA
0002:00000678 00000110H .CRT$XIAA DATA
0002:00000788 00000110H .CRT$XIAC DATA
0002:00000898 00000110H .CRT$XIZ DATA
0002:000009a8 00000110H .CRT$XPA DATA
0002:00000ab8 00000110H .CRT$XPZ DATA
0002:00000bc8 00000110H .CRT$XTA DATA
0002:00000cd8 00000118H .CRT$XTZ DATA
0002:00000df0 0002c960H .rdata DATA
0002:0002d750 00000998H .rdata$r DATA
0002:0002e0e8 00000178H .rdata$zzzdbg DATA
0002:0002e260 00000110H .rtc$IAA DATA
0002:0002e370 00000188H .rtc$IMZ DATA
0002:0002e4f8 00000110H .rtc$IZZ DATA
0002:0002e608 00000110H .rtc$TAA DATA
0002:0002e718 00000188H .rtc$TMZ DATA
0002:0002e8a0 00000110H .rtc$TZZ DATA
0002:0002e9b0 00003b68H .xdata DATA
0002:00032518 00000275H .xdata$x DATA
0002:0003278d 00000000H .edata DATA
0003:00000000 000023e0H .data DATA
0003:000023e0 00000580H .data$r DATA
0003:00002960 77376001H .bss DATA
0004:00000000 0000369cH .pdata DATA
0005:00000000 00000ed0H .idata$5 DATA
0005:00000ed0 000000c8H .idata$2 DATA
0005:00000f98 00000018H .idata$3 DATA
0005:00000fb0 00000ed0H .idata$4 DATA
0005:00001e80 00001fc6H .idata$6 DATA
0006:00000000 0000015eH .gfids$y DATA
0007:00000000 0000011bH .00cfg DATA
0008:00000000 00000170H .rsrc$01 DATA
0008:00000170 000002ccH .rsrc$02 DATA
Address Publics by Value Rva+Base Lib:Object
0000:00000000 __guard_iat_table 0000000000000000 <absolute>
0000:00000000 __guard_longjmp_count 0000000000000000 <absolute>
0000:00000000 __guard_longjmp_table 0000000000000000 <absolute>
0000:00000000 __guard_fids_count 0000000000000000 <absolute>
0000:00000000 ___safe_se_handler_table 0000000000000000 <absolute>
0000:00000000 ___safe_se_handler_count 0000000000000000 <absolute>
0000:00000000 __guard_iat_count 0000000000000000 <absolute>
0000:00000000 __guard_fids_table 0000000000000000 <absolute>
0000:00000000 __dynamic_value_reloc_table 0000000000000000 <absolute>
0000:00000100 __guard_flags 0000000000000100 <absolute>
0000:00000000 __ImageBase 0000000140000000 <linker-defined>
0001:00002aa0 ?readstring@@YAXPEAD0@Z 0000000140003aa0 f COMMAND.obj
0001:00002b70 ?make_phere@@YAXH@Z 0000000140003b70 f COMMAND.obj
0001:00002c50 ?load_snap@@YAXXZ 0000000140003c50 f COMMAND.obj
0001:00002d30 ?i_rand_0_n_inclusive@@YAHH@Z 0000000140003d30 f COMMAND.obj
77BB8000 .data
それはほぼ間違いなく問題です。非常に大きなデータセクションがあります。そのサイズは、Windows上の単一の実行可能モジュールで可能なサイズに疑わしいほど近いです。このサンプルCプログラムから、より一貫性のある再現を得ることができます。
unsigned char kaboom[0x7d000000];
int main()
{
return 0;
}
ところで、あまり良いエラーメッセージではありませんが、Microsoftはこのコーナーケースのエラーコードを予約していません。そして確かに、0x77BB8000でエッジに近づくと、それはうまく繰り返されません。実行可能イメージは、コードとデータをメモリにマップするためにローダーが作成するメモリマップファイルの単一のビューに適合している必要があります。ビューには2ギガバイトの厳しい上限があります。これは32ビットプロセスの基本であり、64ビットバージョンのWindowsでもMMFビューサイズの制限があります。
そのデータセクションに使用できるスペースの量は、実行ごとに異なります。ビューサイズから差し引かれるのは、アドレススペースの開始と終了のマップ不可能な領域と、32ビットEXEプロセスのオペレーティングシステムDLL(少なくともntdll.dllとkernel32.dll)に必要なスペースです。そして、ASLR(アドレス空間配置のランダム化)によって失われるスペースは、数が変化します。また、マルウェア対策やDropboxで使用されるDLLのように挿入されるDLL。
データセクションをこれほど大きくする必要がある理由は推測できません。リンカに.mapファイルを生成するように依頼して、セクションの内訳を取得します。大きなグローバル変数が飛び出すはずです。利用可能なアドレス空間がたくさんあるように、必ずx64をターゲットにして、フリーストア(mallocなど)を使用して大きな配列を割り当ててください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加