問題タブ [stack-overflow]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 構造マップStackoverflow例外
「GetInstance」(最後の行)を呼び出すと、stackoverflow例外が発生し続けます。すべて、はいすべてのタイプがITrackerを実装しています。MultiTrackerには、ITrackerの配列である単一のパラメーターを持つコンストラクターがあります。
StructureMapは、タイプITrackerを要求するときにMultiTrackerが必要なデフォルトのクラスであると言ったという事実を無視しているようです。
私はそれを機能させることができません。何かご意見は?
asp.net - WinDbg と ADPlus で StackOverflowException をキャッチするのに役立ちます
短縮版
何かがクリーンアップされる前に、最初のチャンスの StackOverflowException で完全なメモリ ダンプを実行し、他のすべての例外の種類を無視する ADPlus スクリプトが必要です。
ログバージョン
新しい ASP.NET コードのリリース後、断続的な StackOverflowExceptions が発生するようになりました。前回の既知の正常なインストール以降に追加されたリビジョンで、無限の再帰とすべての通常の疑わしいものを探しましたが、何も見つかりません。Web サイトは最大 1 時間実行された後、クラッシュします。
WinDbg と SOS を使用し、次のコマンドを使用して、ADPlus を使用してクラッシュ ログを取得しようとしました。
-NoDumpOnFirst の理由は、ビジー状態のサーバー上でのみこのエラーを再現できるためです。最初の例外が発生するたびにミニダンプを実行するために (まあ、それは起こります)、デバッガーは IIS ワーカー プロセスを一時停止して 16 MB のファイルを書き出す必要があるため、要求がキューに入れられ、アプリケーションが不安定になります。エラーが頭をもたげるのに最大 1 時間かかる場合があるため、これは問題です。
したがって、-NoDumpOnFirst を使用すると、WinDbg がこれらのスレッドを出力するダンプ ファイルを取得します。
例外を出力しようとすると、スタック トレースがないことが示され、他のメソッドはそれがアンマネージ コードであると不平を言います。私の推測では、プロセスの終了時にダンプが作成されるため、すべてのスレッドがガベージ コレクションされており、取得する情報は残っていません。
デバッガーが StackOverflowException の最初のチャンスで完全なダンプを実行し、他のすべての例外の種類を無視することを本当に望んでいます。ADPlus が構成ファイル ( http://msdn.microsoft.com/en-us/library/cc409304.aspx )を使用できることは知っていますが、形式はすべてギリシャ語です。これを行う ADPlus スクリプトの作成方法を教えてもらえますか?
...もちろん、上記のスレッド リストを見て何が問題なのかを正確に把握している場合、または私がさらに情報を提供すればそれを理解できる場合は、それも教えてください。
解決の試み 1
以下の答えをありがとうdeemok、それは完全には正しくありませんでしたが、それは私を正しい方向に押し上げました. スタック オーバーフローの例外コードが間違っていた (sbo ではなく sov である) (または、当時はそう思っていたので、以下の deemok の編集を参照)、次の構成でデバッグを試みました。
そして、次のコマンドを使用します。
出力されたログ ファイルが正しい構成を示していることを確認しました。秘訣は、adplus のコマンド ライン パラメータが順番に実行されることです。そのため、初回例外をトラップする構成から開始してから -NoDumpOnFirst を適用すると、構成設定が上書きされます。-c last を指定して構成を適用すると、その設定が優先されます。
しかし、最終的に、スタック オーバーフローはキャッチ不能であることが判明しました。スタック オーバーフローが発生し、メモリ ダンプが取得できず、2 回目のプロセス終了イベントでダンプが発生し、再びすべてがガベージ コレクションされて、有用な情報が得られませんでした。
スタック オーバーフローに関与してオーバーライドしている場合に備えて、プロセス終了例外を短絡しようとしましたが、例外が発生し、メモリ ダンプが得られませんでした。
幸いなことに、コードを調べて答えを見つけました。もちろん、これは循環メソッド呼び出しのケースでした。
実際の解像度
この問題はかなり前に解決されていましたが、スタック オーバーフローを引き起こす ASP.NET ページをすぐに作成しました。(結局のところ、それは難しいことではありません)そして、以下のAxlの応答を試しました.
XML が少しずれて</ADPlus>
いました。Axl はタグを閉じるのを忘れていました (または、おそらくコピーと貼り付けで失われました)。しかし、それは簡単に修正でき、adplus は親切にも何が問題なのかを正確に教えてくれました。
そのスクリプトをテスト スタック オーバーフロー スローアーに対して設定し、結果を windbg にロードしました。!clrstack を呼び出すと、相互に循環的に呼び出しているメソッドの非常に明確な (そして長い) リストが得られました。これで問題が一瞬で見つかりました!次回スタック オーバーフローが発生したときのために、このページをブックマークしておきます。
c++ - 大規模な 2D 配列でセグメンテーション違反が発生する
Linux でいくつかの C++ コードを書いており、次のようにいくつかの 2D 配列を宣言しています。
コンパイル中にエラーはありません。実行すると、「セグメンテーション違反」と表示されます。
配列のサイズを 5000 から 50 に減らすと、プログラムは正常に動作します。この問題から身を守るにはどうすればよいですか?
security - SSP (StackSmashing Protection)/Propolice をバイパスする方法はありますか?
いくつかの調査の後、これを行う方法を説明している論文は見つかりませんでした(信頼できないものでもありません)。SSP(StackSmashing Protection)/プロポリスらしい
f# - スタック オーバーフローの回避 (シーケンスの F# 無限シーケンスを使用)
f# の morris seq 用に書いたこの「学習コード」がありますが、回避方法がわからないスタック オーバーフローに悩まされています。"morris" は、無限の "see and say" シーケンス (つまり、{{1}、{1,1}、{2,1}、{1,2,1,1}、{1,1,1) を返します。 ,2,2,1}, {3,1,2,2,1,1},...})。
Seq.nth を使用して n 番目の反復を選択できますが、スタック オーバーフローに達する前にしか取得できません。私が持っている再帰の 1 つのビットは末尾再帰であり、本質的にリンクされた一連の列挙子を構築します。問題はそこじゃない。4000番目のシーケンスで「enum」が呼び出されたときです。F# 1.9.6.16 では、以前のバージョンは 14000 を超えていたことに注意してください)。これは、リンクされたシーケンスが解決される方法によるものです。シーケンスは遅延しているため、「再帰」も遅延しています。つまり、seq n は seq n-1 を呼び出し、seq n-2 を呼び出し、以下同様に最初の項目を取得します (最初の # が最悪のケースです)。
が問題を悪化させていることを理解しており[|0|] |> Seq.append str |> Seq.windowed 2
、それを排除すれば、生成できる # を 3 倍にすることができます。実際には、コードは十分に機能します。morris の 3125 回目の反復は、長さが 10^359 文字を超えます。
私が実際に解決しようとしている問題は、遅延評価を保持し、選択できる反復のスタック サイズに基づいて制限をなくす方法です。メモリ サイズに基づいて制限を行うための適切な F# イディオムを探しています。
2010年10月更新
F# をもう少しよく学び、Haskell を少し学び、この問題を 1 年以上考え、調査した結果、ようやく自分の質問に答えることができました。しかし、難しい問題はいつもそうですが、問題は間違った質問から始まります。問題はシーケンスのシーケンスではありません。実際には、再帰的に定義されたシーケンスが原因です。私の関数型プログラミングのスキルは少し良くなったので、以下のバージョンで何が起こっているのかを簡単に確認できます。
これは基本的に、シーケンスを生成するための Seq 処理関数呼び出しの非常に長いチェーンを作成します。F# に付属している Seq モジュールは、スタックを使用しないとチェーンをたどることができないものです。追加および再帰的に定義されたシーケンスに使用する最適化がありますが、その最適化は、再帰が追加を実装している場合にのみ機能します。
だからこれはうまくいく
そして、これはスタックオーバーフローを取得します。
F# ライブラリが問題であることを証明するために、継続を使用して追加、ペアワイズ、スキャン、および収集を実装する独自の Seq モジュールを作成しました。これで、問題なく 50,000 seq の生成と出力を開始できます (処理が終了したため、終了することはありません)。 10^5697 桁の長さ)。
いくつかの追加メモ:
- 継続は私が探していたイディオムでしたが、この場合は、私のコードではなく、F# ライブラリに入る必要がありました。F# の継続については、Tomas Petricek の Real-World Functional Programmingの本から学びました。
- 私が受け入れた怠惰なリストの回答は、別のイディオムを保持していました。遅延評価。書き直したライブラリでは、遅延型を利用してスタックオーバーフローを回避する必要もありました。
- 怠惰なリストバージョンは運によって機能します(おそらく設計によるものですが、それは私の現在の判断能力を超えています)-構築および反復中に使用されるアクティブパターンマッチングにより、必要な再帰が深くなりすぎる前にリストが値を計算するため、怠惰ですが、スタックオーバーフローを避けるために継続が必要なほど怠惰ではありません。たとえば、2 番目のシーケンスが 1 番目のシーケンスの数字を必要とするときには、すでに計算されています。つまり、LL バージョンは厳密にはシーケンス生成の JIT 遅延ではなく、リスト管理のみです。
mvvm - この無限ループを回避するにはどうすればよいですか?
これには半単純な解決策があるに違いないように感じますが、私には理解できません。
編集:前の例は無限ループをより明確に示しましたが、これはもう少しコンテキストを与えます。問題の概要については、事前編集を確認してください。
次の2つのクラスは、モデルビュービューモデル(MVVM)パターンのビューモデルを表します。
。
要求されない限り、モデル(レシピとカテゴリ)を表示することはしませんが、基本的にビジネスロジックを処理します(たとえば、カテゴリにレシピを追加すると、リンクのもう一方の端も追加されます。つまり、カテゴリにレシピ、そしてレシピもそのカテゴリに含まれています)そして基本的に物事がどうなるかを指示します。ViewModelsは、WPFデータバインディングのための優れたインターフェイスを提供します。それがラッパークラスの理由です
無限ループはコンストラクター内にあり、新しいオブジェクトを作成しようとしているため、どちらのオブジェクトも作成が完了しないため、これを防ぐためにブールフラグを設定することはできません。
私が考えているのは(シングルトンとして、またはコンストラクターに渡されるか、あるいはその両方として)aDictionary<Recipe, RecipeViewModel>
でありDictionary<Category, CategoryViewModel>
、ビューモデルを遅延ロードしますが、ビューモデルが既に存在する場合は新しいモデルを作成しませんが、私は理解していません遅くなってからうまくいくかどうか試してみると、過去6時間ほどこれに対処するのにちょっとうんざりしています。
手元の問題とは関係のないものをたくさん取り出したので、ここのコードがコンパイルされる保証はありません。
size - スタックサイズを監視してスタックオーバーフローを防ぐ方法は?
多くの C/C++/Fortran およびその他のプログラマーは、「スタック オーバーフロー」エラーに遭遇したことがあります。私の質問は、プログラムの実行中にスタックのサイズを監視または確認できるツール、プログラム、または単純なコード スニペットはありますか? これは、スタックが蓄積され、最終的にオーバーフローを引き起こしている場所を特定するのに役立つ場合があります。
memory - メモリを 2GB から 4GB にアップグレードすると、スタック オーバーフローの例外を防ぐことができますか?
私のPCには2GBのRAMメモリがあります。C# 2008 Express Edition で 70.000 項目の配列を持つ 3D メッシュ オブジェクトを形成すると、「スタック オーバーフローの例外が処理されました...」というエラー メッセージが表示されます。RAM メモリを 2 GB から 4 GB にアップグレードすると、このエラー メッセージを解決できますか?