8

これは、ここでのスタックオーバーフローに関する最初の質問なので、具体的にしようと思います。フォーラムで関連トピックを検索しましたが、運がありませんでした。とにかくここに行きます:

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

最初はコンパイル設定の問題ではないかと疑っていましたが、自分のコンピューターでコンパイルした実行可能ファイルを 2 番目のコンピューターに送信したところ、問題なく実行できましたが、自分のマシンでは実行されませんでした。

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

Windows 7 Professional SP1、64 ビットを使用しています。もう一方のコンピューターの OS バージョンは同じです。会社の方針により、ここにソース コードを投稿することはできませんが、ソース コードとは関係ないと思います。実行環境に問題があるのではないかと思います。どんな助けにも感謝します。ありがとう。

コール スタックにあるのは次のとおりです。

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

@WhozCraig の提案のおかげで、コール スタックでより意味のあるメッセージを得ることができました。それでも困惑。

IHR.exe!_mbscmp(const unsigned char * s1=0x00fe8c10, const unsigned char * s2=0x00fe8c10) 行 84 + 0xf バイト
IHR.exe!_mbscmp(const unsigned char * s1=0x00fe8c10, const unsigned char * s2=0x00fe8c10) 行84 + 0xf バイト
IHR.exe!strcmp(const char * _s1=0x00fe8c10, const char * _s2=0x00fe8c10) 1646 行 + 0x2b バイト
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 バイト
IHR.exe!strcmp(const char * _s1= 0x00fe8c10, const char * _s2=0x00fe8c10) 1646 行目 + 0x2b バイト

上記のスタックに至るまで、さらにいくつかあります

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 * _locale=0x00000000) 826 行 + 0x1b バイト
IHR.exe!std::_Locinfo::_Locinfo_ctor(std::_Locinfo * pLocinfo=0x0018f8f8, const char * locname=0x00ea591c ) 192 行目 + 0x9 バイト
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 >::widen(char _Byte=' ') 124 行目 + 0x34 バイト
IHR.exe!std::basic_ios >::init(std::basic_streambuf > * _Strbuf=0x00ff7908, bool _Isstd=false) 135 行目 + 0xa バイト
IHR.exe!std::basic_ostream >::basic_ostream >(std:: basic_streambuf > * _Strbuf=0x00ff7908, bool _Isstd=false) 53
行目 IHR.exe!std::`'cout''() の動的初期化子 13 行目 + 0x16 バイト IHR.exe!_initterm(void (void)* * pfbegin= 0x00e8d10c, void (void)* * pfend=0x00e9dca0) 行 855 IHR.exe!_cinit(int initFloatingPrecision=1) 行 293 + 0xf バイト
IHR.exe! tmainCRTStartup() 行 310 + 0x7 バイト
IHR.exe!mainCRTStartup() 行 196
kernel32.dll!@BaseThreadInitThunk@12() + 0x12 バイト
ntdll.dll!
RtlUserThreadStart@8() + 0x27 バイト
ntdll.dll!
_RtlUserThreadStart@8() + 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 はプログラム全体で問題なく使用されます。ありがとう

4

1 に答える 1

2

グローバル/静的変数があり、mainを実行する前に初期化しようとしている可能性があります。おそらく、実際の初期化の順序は期待したものではありません。別のファイルにあるかのように、作成する順序を判断する方法はありません。

それらの変数を削除するか、同じファイルに配置します。

于 2013-03-15T20:39:01.397 に答える