0

vs2010 で簡単な win32 コンソール プログラムを作成し、null 逆参照を作成します。

int _tmain(int argc, _TCHAR* argv[])
{
    if (*(int*)(NULL) == 5) {
        printf("foo");
    }
    return 0;
}

これをx64構成で実行すると、デバッガーで「未処理の例外」と有効な呼び出しスタックが発生します。に切り替えるとwin32、まだ「ハンドルされていない例外」が発生しますが、スタックは無効です。私は以下を取得します:

ntdll.dll!770a15de()    
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!770a15de()    
ntdll.dll!7709014e()    
>msvcr100d.dll!_heap_alloc_dbg_impl(...)
ffffffff()  

ここで何が起こっているのか、どうすれば修正できるのでしょうか?

4

2 に答える 2

2

問題は、特定の Windows ライブラリのシンボルが不足していることです。これにより、32 ビット実行でスタックを誤って解析する可能性があります。Tools\Options>Debugging>Native:'Load DLL exports' をオンにします。ntdll.dll のシンボルもロードすると便利な場合があります ([モジュール] ウィンドウで右クリックします)。その後、例外が発生したフレームがまだ欠落している場合がありますが、少なくともその時点までのコール スタックが表示されます。

于 2012-06-08T16:07:02.487 に答える
0

デフォルトの「Win32 Debug」でコードを試したところ、有効なコール スタックが得られました。Windows SDK 7.1 を使用しています。プロジェクトの設定を確認する必要があります。

#include <stdio.h>
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
    if (*(int*)(NULL) == 5) {
        printf("foo");
    }
    return 0;
}

test.exe!wmain(int argc, wchar_t**argv) Line 6
test.exe!__tmainCRTStartup() Line552 + 0x19 bytes
...

First-chance exception at 0x0003139e in test.exe: 0xC0000005: Access violation reading location 0x00000000.
Unhandled exception at 0x0003139e in test.exe: 0xC0000005: Access violation reading location 0x00000000.
于 2012-05-15T22:15:49.357 に答える