問題タブ [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.
gcc - レジスタで小さなローカル配列を取得できますか?
いくつかの入力配列と結果配列を含む、パフォーマンスが重要な C/C++ コードを書かなければならないかもしれません (正確な型は気にしないでください)。特定の理由で、出力配列の小さなチャンクで作業し、入力に従ってそれらを変更したいのですが、キャッシュを信頼していないため (つまり、私は入力配列がそれを上書きするのではないかと心配し、実際にメモリの読み取りと書き込みを行うことになるのではないかと心配していました.これは恐ろしいことです.
- 小さいローカルの固定長配列をレジスタのみに格納することはできますか?
- どうすればこれを達成できますか?
- そのようなアレイはどのくらいの大きさにできますか (たとえば、Haswell または Skylake コア上で)?
java - ツリー トラバーサル再帰アルゴリズムでスタック オーバーフロー エラーが発生する可能性があるかどうかを評価する (Java)
特定のツリー トラバーサル再帰アルゴリズムが Java でスタック オーバーフローを生成する状況を理論的に (つまり、実際に実行せずに) 判断する最良の方法は何ですか?
私の質問を明確にするために、次の例を考えてみましょう。Java で実装された単純な二分木があるとします。
このアルゴリズムでは、ネストされた再帰呼び出しの最大数は、ツリーの深さに関して線形です。では、スタック オーバーフロー エラーをスローすることなく、順序通りのトラバーサル アルゴリズム (または類似のアルゴリズム) を完了することができるツリーの最大深さをどのように推定できますか?
-Xss オプションを使用して最大スタック サイズがスレッドによって割り当てられる場合、この数値を再帰アルゴリズムで使用される各スタック フレームの推定値に分割することは正しいですか?
また、パラメーターとローカル変数のサイズをプログラム カウンターのサイズに追加して、各スタック フレームのサイズを見積もるのは正しいですか。プログラム カウンターのサイズはアーキテクチャ (32 ビットと 64 ビットなど) によって異なります。 .
他に何か不足していますか?
アップデート:
スタック オーバーフロー エラーを回避するために、再帰アルゴリズムを反復アルゴリズムに変換できることは知っています。これは、再帰アルゴリズムに関する単なる理論上の質問です。
assembly - print (絶対値) で gdb の ASCII コードが返されるのはなぜですか?
ここに私のアセンブリコードがあります:
入力すると、文字列「asdfsfd」の略であることがわかっていますprint 0x80484d0
。$1 = 134513872
したがって、私の質問は、gdb が実際の文字列ではなく ASCII コードを返す理由と、gdb が文字列を表示するようにオプションを変更する方法です。
そして、もう 1 つの質問:ESP
レジスタがスタックの一番下を見て、そのアドレス Amovl $0x80484d0,(%esp)
を参照していることはわかっていesp
ます。一部の情報が設定されている場合、A + サイズの x80484d0 に変更しesp
ないでください。スタックの一番下を見るにはesp
?この画像は私の質問をより明確にするはずです。私はどこかで間違っていることを知っています。ありがとうございました。esp
python - スタック フレーム間を上下に移動する方法は?
を使用してスタック フレームを取得するとしますsys._getframe(1)
。これは明らかに現在のフレームではありません。
ここで、何らかの方法で、外側のスタック フレームに移動し、多分x=10
のようなステートメントを実行して、そのフレームに変数を作成したいと考えています。
そのように変数を設定するのは良い習慣ではないことは理解していますが、それは他のステートメントかもしれません。で、肝心なのはそのコマにどう動くかです。with(frame)
動作しないようです。
それは可能だと思いますが、そうでなければ、モジュール内にgetinnerframes
とという 2 つの関数があるのはなぜですか? 外側のフレームに移動できない場合、なぜ内側のフレームを使用する必要があるのですか?getouterframes
inspect
編集:モジュールには、ドキュメントが言ってpdb
いる上下に2つのコマンドがあります
d(own) スタック トレース内で現在のフレームを 1 レベル下に (新しいフレームに) 移動します。
u(p) スタック トレースで現在のフレームを 1 レベル上に (古いフレームに) 移動します。
これは私の場合に役立ちますか?はいの場合、どのように使用しますか?
c - x86_64 : スタック フレーム ポインタはほとんど役に立たない?
- Linux x86_64。
- gcc 5.x
-fomit-frame-pointer を使用する場合と使用しない場合の 2 つのコードの出力を調べていました ("-O3" の gcc は、デフォルトでそのオプションを有効にします)。
私の質問は:
そのオプションをグローバルに無効にすると、極端な場合でもオペレーティング システムをコンパイルする場合でも問題はありますか?
割り込みがその情報を使用することを知っているので、そのオプションはユーザー空間にのみ適していますか?
ios - iOSで任意のスレッドの正しいフレームポインタを取得する方法は?
フレームポインタを取得する方法
iPhone 5s デバイス / Xcode 7 で実行されているデモ アプリで、を使用しframe pointer
て任意のスレッドの を取得しようとしましthread_get_state
たが、常に正しくないスレッドが発生します。
私は次のようにフレームポインタを読みました: uintptr_t fp = machineContext.__ss.__fp;
、Apple Doc ( ARMv6およびARM64 ) によると、
レジスタ R7 は、ARMv6 でフレーム ポインタとして使用されます。
一方、ARM64 では x29
フレーム ポインター レジスタ (x29) は常に有効なフレーム レコードをアドレス指定する必要がありますが、リーフ関数やテール コールなどの一部の関数は、このリストにエントリを作成しないことを選択する場合があります。その結果、デバッグ情報がなくても、スタック トレースは常に意味のあるものになります。
フレームポインタが間違っていることを証明する方法
machineContext.__ss.__fp
fp ( ) が正しいフレーム ポインタではないことを証明するにはどうすればよいですか?
パラメータが現在のスレッド、たとえば mach_thread_self() の場合、fp は常に 0
__builtin_frame_address(0)
であり、これは;とは異なります。パラメーターが現在のスレッド (メイン スレッドなど) でない場合、前のフレーム ポインターへのポインターは
fp
、2 つまたは 3 つのフレームで NULL になります。これは、スタック フレームの通常のリンク リストには短すぎます。まだ現在のスレッドではありませんが、
backtrace
メイン スレッドの前に使用してコール スタック アドレスを出力しますsleep
。次に、別のスレッドで、メイン スレッドを中断しthread_get_state
、コール スタックをウォークするために使用するフレーム ポインターを読み取ります。2 つのバックトレース バッファーはまったく異なります。
何が私を混乱させますか
Apple Docによると、 The frame pointer register (x29) must always address a valid frame record ですが、そこからZERO値を読み取ることができました。
さらに、ARM Doc
状態プロシージャ コール標準のすべてのバリアントで、レジスタ r16、r17、r29、および r30 には特別な役割があります。これらの役割では、アドレスを保持するために使用される場合、IP0、IP1、FP、および LR というラベルが付けられます。
_STRUCT_MCONTEXT
の値の一部の例を次に示します。
私が探しているもの
Frame Pointer
現在、任意のスレッドの正しい値を取得する方法を探しています。
助けてくれてありがとう!
更新 1
もちろん、私が望むのはFrame Pointer
、任意のスレッドのリーフ スタック フレームを正しく取得し、コール スタックを に沿って移動するPrevious Pointer
ことですFrame pointer
。
この前に、これらのリンクを読みました:
iPad アプリですべてのアクティブなスレッドをループする方法
再度、感謝します。
更新 2
他のプラットフォームでも試してみましたが、同じ結果:間違ったフレーム ポインターです。
返される値framePointerOfMachineContext
は と同じではありません__builtin_frame_address(0)
。
更新 3
同僚に触発されて、インライン asm を試し、i386 で作成しました。
ebp
変数は と同じ値を保持するようになりましたbuiltinFP
。しかし、任意のスレッドでこれを行う方法は?