問題タブ [stack-frame]
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.
objective-c - スタック-フレーム-Objective-Cのヒープ
このサイトで見つけたすべての質問はStack
vsのみを参照しHeap
ており、説明はしていませんFrame
。ここに私の質問があります。3つすべての違いを理解しないでください。
私が知っていること:
Frame
:Aframe
は、関数のインスタンス変数の黒板のようなものです。関数の実行中、すべてのインスタンス変数はframe
その関数の内部に格納されます。関数が呼び出されると、その
frame
上に作成されstack
ます。
Stack
:Aはの物理としてstack
視覚化できます。メソッド(または関数)が実行されると、からメモリのチャンクが割り当てられます。stack
frames
stack
Heap
:すべてのオブジェクトポインタはに存在しheap
ます。
スタックとフレームは明確です(私は思います)が、私は私のHeap
声明に正しいですか?
c# - Silverlight のメソッドからメソッド名を取得できないことがある
Silverlight クライアントからのエラーをログに記録する次のメソッドがあります。
私の問題は、アプリを実行して例外をスローするメソッドを呼び出すと、次のようにログに記録されることです。
しかし、通常の (開発者以外のランタイム) を持っている人がこのアプリを実行し、例外をスローすると、次のようにログに記録されます。
これは、SDK Silverlight ランタイムによるものだと推測しているだけです。ほとんどの同僚が Silverlight SDK をインストールしているため、判断が難しいです...これがこの異常の理由であるかどうかを誰か確認できますか?
解決しました!
SDK ランタイムによるものではなく、匿名メソッドを呼び出したからです。次のコード行を追加しました。
これがリソースをどれだけ消費するかについては心配していません。なぜなら、例外が発生した後、ユーザーは何をしていても停止してサポートに連絡するからです。
assembly - アセンブリx86に新しい命令を挿入するときのスタックフレームサイズ?
スタックフレーム内にアセンブリx86コードに新しい関数と命令を挿入する場合、スタックサイズを増やす必要がありますか?はいの場合、いくらですか?
python - Pythonで関数スタックデータをリリースするのはいつですか?
次のコードのテストについて、これについて質問があります。
1、
2、
- file_close_testが終了すると、ファイルオブジェクトへの参照がないため、ファイルオブジェクトが閉じられました。
- 例外が発生した後、ファイルオブジェクトが閉じられていないため、関連するスタックデータが解放されていないと思います。
- exception_wrapperの終了後、ファイルは自動的に閉じられました。
これを説明してもらえますか?ありがとう。
python - Pythonクラススタックフレームの制限
次の形式のクラスがある場合:
関数を呼び出すことができる回数に制限はありますか?例えば:
getNewObject()
の戻り値を呼び出すことができる回数に制限はありgetNewObject()
ますか?もしそうなら、どのような要因がこれに影響しますか?
assembly - この場合のOllyDbgとアセンブラーのEBP+8はどういう意味ですか?
文書化されていない関数の使用方法を学ぶために、OllyDbgでアセンブラーとデバッグのスキルを学んでいます。今、私は次の問題を抱えています:
私は次のコード部分を持っています(OllyDbgから):
これが関数の始まりであり、目標はデータ構造を見つけることです。そのため、最初にEBPをスタックにプッシュし、次にESP(現在のスタックポインター)をEBPに移動して、関数のスタックフレームを定義していることがわかりました。チュートリアルでは、一般的なレイアウトでは、最初の引数は[EBP + 8]に配置され、2番目の引数は[EBP+C]に配置されると書かれています。
これは私が理解していないことです。最初のパラメーターがEBP+8に配置されていることをどのように知ることができますか?
誰かが私を助けてくれることを願っています!ありがとう!
java - スタックの一番下を表示するためにJavaスタックトレースのサイズを拡張する方法は?(スタックオーバーフローのトリガー)
Javaでは、完全な、切り捨てられていないスタックトレースを表示する方法はありますか(たとえば、記録されるフレームの数を増やすことによって)、またはスタックトレースの一番下に表示する方法はありますか?通常、スタックトレースは、1024フレームの価値で上から切り捨てられますが、スタックオーバーフローの問題の場合、再帰をトリガーした呼び出しを誰が行ったかを下の方で確認する必要があるため、これはかなり価値がありません。スタックの途中で切り捨てる方がはるかに優れていますが、SunのJVMはこれを行うのに十分なほど賢くないようです。
おそらく、いくつかの特別な太陽固有のフラグでさえありますか?スタックサイズを最小許容値(-Xss1000)に減らしてみましたが、それでも1024フレーム以上の価値があります。
私の場合、Hadoopマッパーで発生するスタックオーバーフローをデバッグしようとしていますが、これは非常に大きな入力で実行している場合に限られます。問題が発生するのは、再帰操作(ScalaのfoldRight
)が非常に大きなリンクリストで実行されているためだと思います。非再帰的に書き直す必要があります...しかし、誰がを呼び出したかを知る必要がありますfoldRight
。これは、多くの場所で直接的および間接的に呼び出される基本的なルーチンであり、私が使用しているコードはたくさんあるので、これは非常に明白ではありません。
c - サブスコープを持つ関数のスタック フレーム構造
{}
以下は、関数内に存在 するサブ スコープ (または) ダミー スコープ (単に ) がスタック フレームの構造にどのように影響するかを理解するために参考にしたコードです。
サンプル出力
以上の行動から、以下のように推測します。
- スコープのスタック フレームの作成はありません
{}
。 - このようにして
auto
、宣言/定義された変数とmain
サブスコープ内の変数{}
は同じスタック フレームを共有します。 - したがって、 で宣言/定義された変数は
main
、関数内のどこでも (サブ スコープ内であっても) 自由にアクセスできます。 - 一方、サブスコープで宣言/定義された変数は、ブロックの外でそのスコープを失います。ただし、スタックフレームが存在する限り、その有効期間は有効です。
質問:上記の点が正しければ、同じ変数の複数の定義 (1 つは 内main
、もう1 つは 内) を指定しても、コードが失敗しないのはなぜですか{}
。
performance - フレームポインタを省略すると、パフォーマンスにプラスの効果があり、デバッグ能力にマイナスの効果がありますか?
ずっと前にアドバイスされたように、私は常にフレーム ポインターを使用せずにリリース実行可能ファイルをビルドします (/Ox でコンパイルする場合の既定値です)。
ただし、今、論文http://research.microsoft.com/apps/pubs/default.aspx?id=81176を読みましたが、フレーム ポインタはパフォーマンスにあまり影響を与えません。そのため、完全に最適化 (/Ox を使用) するか、フレーム ポインターを使用して完全に最適化 (/Ox /Oy- を使用) しても、実際にはパフォーマンスに違いはありません。
Microsoft は、フレーム ポインター (/Oy-) を追加するとデバッグが容易になると指摘しているようですが、これは本当ですか?
私はいくつかの実験を行い、次のことに気付きました。
- 単純な 32 ビット テスト実行可能ファイル (/Ox /Ob0 を使用してコンパイル) では、フレーム ポインターを省略するとパフォーマンスが向上します (約 10%)。ただし、このテスト実行可能ファイルは、いくつかの関数呼び出しのみを実行し、他には何も実行しません。
- 私自身のアプリケーションでは、フレーム ポインターの追加/削除は大きな影響を与えないようです。フレーム ポインターを追加すると、アプリケーションは約 5% 高速になるようですが、誤差の範囲内である可能性があります。
フレームポインタに関する一般的なアドバイスは何ですか?
- それらは実際にパフォーマンスに良い影響を与えるため、リリース実行可能ファイルでは省略 (/Ox) する必要がありますか?
- デバッグ機能を向上させるため (クラッシュ ダンプ ファイルを使用してデバッグする場合)、リリース実行可能ファイルに追加 (/Ox /Oy-) する必要がありますか?
Visual Studio 2010 を使用しています。
c - main()がmain()を呼び出すと、スタックフレームはどうなりますか
次のコードを検討してください。
コンパイル:
実行する:
ここで、main()はself()を呼び出しています。
関数の元のスタックフレームは、それ自体が呼び出されるmain()
たびに上書きされるようです。main()
しかし、差出人住所はどうなりますか?関数はそれ自体のスタックフレームに戻ることができますか?
この疑問を明確にするのを手伝ってください。
ありがとう。