2013-03-15 6 views
8

これは私の最初の質問stackoverflow上ですので、私は具体的にしようとします。私は関連するトピックについてはフォーラムを検索しましたが、運はありません。とにかくここに行く:前にスタックオーバーフロー例外main()

私はVisual Studio 2005.Iを使用しているスタックオーバーフローの例外が発生しました:IHR.exeの0x775715deで未処理の例外:0xC00000FD:スタックオーバーフロー。私のプロジェクトをデバッグしようとしています。呼び出しスタックは、main()関数を入力する前でもntdll.dllで停止するので役に立ちません。

私はそれがコンパイル設定の問題かもしれないと思っていましたが、私のコンピュータ上でコンパイルされた実行可能ファイルを別のコンピュータに送ったとき、それはうまく動作し、私のマシン上では動作しません。

逆も同じですが、私は2番目のコンピュータで実行可能ファイルをコンパイルしました。しかし、私のコンピュータ上の2番目のコンピュータでコンパイルされた実行可能ファイルを実行しようとすると、実行できませんでした。表示されたのは空のコマンドプロンプトと、プログラムが応答していないことを示すWindowsメッセージでした。

私はWindows 7 Professional SP1 64ビットを使用しています。他のコンピュータのOSバージョンは同じです。会社の方針のため、私はここにソースコードを投稿することはできませんが、とにかくソースコードとは関係ないと思います。私はそれがランタイム環境で問題になるかもしれないと思う。助けをお待ちしています。ありがとう。

はここでコールスタック上のすべてです:@ WhozCraigの提案に

->ntdll.dll!775715de() 
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!775715de()  
ntdll.dll!7756014e() 

おかげで、私は、コールスタック上のより意味のメッセージを取得するために管理しています。まだ困った。

IHR.exe!_mbscmp(のconst unsigned char型* S1 = 0x00fe8c10、CONSTはunsigned char * S2 = 0x00fe8c10)ライン84 + 0xFのバイト
IHR.exe!の_mbscmp(定数はunsigned char * S1 = 0x00fe8c10、CONST + 0x2Bをバイトはunsigned char * S2 = 0x00fe8c10)ライン84 + 0xFのバイト
IHR.exe!strcmpの(のconstのchar * _s1 = 0x00fe8c10、CONSTのchar * _s2 = 0x00fe8c10)ライン1646
IHR.exe!_mbscmp_l(のconst unsigned char型* s1 = 0x00fe8c10、const unsigned char * s2 = 0x00fe8c10、localeinfo_struct * plocinfo = 0x00000000)行58 + 0xdバイト
IHR.exe!_mbscmp(const unsigned char * s1 = 0x00fe8c10、const unsigned char * s2 = 0x00fe8c10)行84 + 0xf + 0x2Bをバイト

バイト
IHR.exe!strcmpの(のconstのchar * _s1 = 0x00fe8c10、CONSTのchar * _s2 = 0x00fe8c10)ライン1646は、ここに

IHR.exe!_mbscmp_l(const unsigned char * s1=0x00fe8c10, const unsigned char * s2=0x00fe8c10, localeinfo_struct * plocinfo=0x00000000) Line 58 + 0xd bytes C++ 
IHR.exe!_mbscmp(const unsigned char * s1=0x00fe8c10, const unsigned char * s2=0x00fe8c10) Line 84 + 0xf bytes C++ 
IHR.exe!strcmp(const char * _s1=0x00fe8c10, const char * _s2=0x00fe8c10) Line 1646 + 0x2b bytes  
IHR.exe!_setlocale_get_all(threadlocaleinfostruct * ploci=0x002f13a0) Line 1147 + 0x24 bytes 
IHR.exe!_setlocale_nolock(threadlocaleinfostruct * ploci=0x002f13a0, int _category=0, const char * _locale=0x00000000) Line 966 + 0x9 bytes C 
の上にスタックに至るまで、より多くのいくつかです

IHR.exe!のはsetlocale(int型_category = 0、constのchar型*から_locate = 0x00000000の)ライン826 +として0x1Bバイト
IHR.exe!のstd :: _ Locinfo :: _ Locinfo_ctor(STD :: _ Locinfo * pLocinfo = 0x0018f8f8、CONST char * locname = 0x00ea591c)Line 192 + 0x9 bytes
IHR.exe!std :: _ Locinfo :: _ Locinfo(const char * _Pch = 0x00ea591c)行78 + 0xdバイト
IHR.exe!std :: ctype :: ctype(const short * _Table = 0x00000000、bool _Deletetable = false 、unsigned int _Refs = 0)行1740 + 0x10バイト
IHR.exe!std :: ctype :: _ Getcat(const std :: locale :: facet * * _Ppf = 0x0018fbd8)行1760 + 0x4dバイト IHR.exe! std :: use_facet>(const std :: locale & _Loc = {...})行478 + 0x9バイト IHR.exe!std :: basic_ios> ::広げる(文字_Byte =」「)線124 + 0x34のバイト
IHR.exe!のstd :: basic_ios> ::のinit(STD :: basic_streambuf> * _Strbuf = 0x00ff7908、BOOL _Isstd =偽)行135 + 0xaバイト
IHR.exe!std :: basic_ostream> :: basic_ostream>(std :: basic_streambuf> * _Strbuf = 0x00ff7908、bool _Isstd = false)行53
IHR.exe!std :: `dynamic initializer (void)* * pfend = 0x00e9dca0)855 IHR.exe!_ init(int initFloatingPrecision = 1)行293 + 0xfバイト
IHR.exe! tmainCRTStartup()ライン310 +を0x7バイト
IHR.exe!mainCRTStartup()ライン196
kernel32.dllの!@ BaseThreadInitThunk 12()+ 0x12にバイト
ntdll.dllの@! 8 @
RtlUserThreadStart()+は0x27バイト
ntdll.dllの!
8 @ _RtlUserThreadStart()+として0x1Bバイト

は、それがスタックオーバーフロー例外に当たるまで繰り返しのstrcmp、mbscmp、mbscmp_lを呼び出し続けます。

アップデート(2013年4月11日):私は、問題の原因となる行を見つけたが、それはそれを引き起こしている理由についてはまだ完全に無知だきました。それはstrcmpの使い方です。

struct Foo 
{ 
    char text[4]; 
    bool operator < (const Foo &rhs) const 
{ 
    return strcmp(text, rhs.text) < 0; 
} 
} 

このstrcmpがコメント化されたとき。プログラムはクラッシュしませんでした。このような問題に対処するためのアイデアや経験はありますか?同じプログラムが他のマシンでも正常に動作しますが、このラインのためにマシン上でのみクラッシュします。他のstrcmpは問題なくプログラム全体で使用されます。おかげ

+2

単純な「hello world」プログラムは同じ動作をしますか?それは、あなたのコードについては、少なくともある程度は何かです。 –

+0

いいえ、Hello Worldはこの問題を引き起こしません。それが私のコードと関係があるなら、なぜ同じOSを持つ別のコンピュータで動かすことができますか? – mikevil14rin

+0

ポストスタックトレースは、メインの前に起こっている場合、それは –

答えて

2

あなたがグローバル/静的変数を持っているし、彼らはあなたがメインの実行前に初期化しようとしている可能性が高いです。おそらく、実際の初期化の順序は、あなたが期待するものではないでしょう。異なるファイルにあるように、作成する順番を教える方法はありません。

のどちらかがこれらの変数を削除したり、同じファイルにそれらを配置します。

関連する問題