C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

StackOverFlowException発生部の特定


(過去ログ 133 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■78814 / inTopicNo.1)  StackOverFlowException発生部の特定
  
□投稿者/ ass (1回)-(2016/02/18(Thu) 17:36:04)

分類:[C#] 

開発環境:Visual Studio 2012
開発言語:C#

お世話になっております。

C#でStackOverFlowExceptionが発生した際に、
発生した部分を特定することは可能なのでしょうか。

もし可能なのであれば、どの程度まで例外が発生した部分の情報を得られるのでしょうか。
(例外が発生した関数、行番号など)

どなたかご教授をお願いします。
引用返信 編集キー/
■78819 / inTopicNo.2)  Re[1]: StackOverFlowException発生部の特定
□投稿者/ 774RR (377回)-(2016/02/19(Fri) 08:41:17)
フツーに Debug build すると「呼び出し履歴」にていろいろ確認できると思うけど
そういうことではない?

static void infloop() { infloop(); }
static void Main(string[] args) { infloop(); }

「呼び出し履歴」
stackoverflow.exe!stackoverflow.Program.infloop() 行 10 + 0xffffffdf バイト
stackoverflow.exe!stackoverflow.Program.infloop() 行 11 + 0x05 バイト
以下略

引用返信 編集キー/
■78820 / inTopicNo.3)  StackOverFlowException発生部の特定
□投稿者/ ぶなっぷ (72回)-(2016/02/19(Fri) 09:59:44)
2016/02/19(Fri) 10:05:07 編集(投稿者)

StackOverFlowが起きるのって、現実的にどういうとき?
1) 巨大な複数次元配列を定義した
2) 再帰呼び出しを伴うプログラムにおいて再帰呼び出しが深くなりすぎた
3) メッセージやイベントを介して無限呼び出しがおきる場合

いろんなパターンがありますが、よく聞くのはこのパターン。

1)なら、その配列を定義した場所が問題であり、ヒープメモリに置き換えようと
いうことです(new []とか)。

2) は、再帰呼び出しの脱出口の用意に失敗して、事実上の無限ループになって
いるケースが多いです。だから、実際にStackOverFlowが発生している場所、つ
まり関数呼び出しにはなんの問題も無いので、例外が発生した場所を調べても無
意味です。
なぜ、無限ループに陥っているのか(再帰呼び出しを脱出できないのか?)を調べ
ましょう。

2)が正常系で起きる場合もあります。
この場合は、本当に正常系で資源を食い尽くしているので、小手先で修正するこ
とは不可能です。
私も以前、このパターンにはまったことがあり、
再帰呼び出しだったコードをアルゴリズムから見直して、非再帰呼び出し型に変
換して直しました。苦労した(笑)

3) は2)の特殊系です。
たとえば、
・コンボボックスのリスト選択イベントの中で、リストを再選択
・再選択したからイベントが発生
・コンボボックスのリスト選択イベントの中で、リストを再選択
: (以下、無限ループ)
といった具合です。

結論として、何が言いたいかというとStackOverFlowはそれが起きている場所に
原因が無いことが多いので、
> (例外が発生した関数、行番号など)
は知ることにあまり意味が無いと。

で、2) 3)の場合、無限ループでも正常系でも「呼び出し履歴」に同じメソッド
の呼び出し履歴がたくさん残ります。
それが目印になるよと、774RRさんもそのようにおっしゃっているわけです。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -