問題タブ [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.

0 投票する
1 に答える
190 参照

gcc - レジスタで小さなローカル配列を取得できますか?

いくつかの入力配列と結果配列を含む、パフォーマンスが重要な C/C++ コードを書かなければならないかもしれません (正確な型は気にしないでください)。特定の理由で、出力配列の小さなチャンクで作業し、入力に従ってそれらを変更したいのですが、キャッシュを信頼していないため (つまり、私は入力配列がそれを上書きするのではないかと心配し、実際にメモリの読み取りと書き込みを行うことになるのではないかと心配していました.これは恐ろしいことです.

  • 小さいローカルの固定長配列をレジスタのみに格納することはできますか?
  • どうすればこれを達成できますか?
  • そのようなアレイはどのくらいの大きさにできますか (たとえば、Haswell または Skylake コア上で)?
0 投票する
1 に答える
458 参照

java - ツリー トラバーサル再帰アルゴリズムでスタック オーバーフロー エラーが発生する可能性があるかどうかを評価する (Java)

特定のツリー トラバーサル再帰アルゴリズムが Java でスタック オーバーフローを生成する状況を理論的に (つまり、実際に実行せずに) 判断する最良の方法は何ですか?

私の質問を明確にするために、次の例を考えてみましょう。Java で実装された単純な二分木があるとします。

このアルゴリズムでは、ネストされた再帰呼び出しの最大数は、ツリーの深さに関して線形です。では、スタック オーバーフロー エラーをスローすることなく、順序通りのトラバーサル アルゴリズム (または類似のアルゴリズム) を完了することができるツリーの最大深さをどのように推定できますか?

-Xss オプションを使用して最大スタック サイズがスレッドによって割り当てられる場合、この数値を再帰アルゴリズムで使用される各スタック フレームの推定値に分割することは正しいですか?

また、パラメーターとローカル変数のサイズをプログラム カウンターのサイズに追加して、各スタック フレームのサイズを見積もるのは正しいですか。プログラム カウンターのサイズはアーキテクチャ (32 ビットと 64 ビットなど) によって異なります。 .

他に何か不足していますか?

アップデート:

スタック オーバーフロー エラーを回避するために、再帰アルゴリズムを反復アルゴリズムに変換できることは知っています。これは、再帰アルゴリズムに関する単なる理論上の質問です。

0 投票する
1 に答える
266 参照

assembly - print (絶対値) で gdb の ASCII コードが返されるのはなぜですか?

ここに私のアセンブリコードがあります:

入力すると、文字列「asdfsfd」の略であることがわかっていますprint 0x80484d0$1 = 134513872したがって、私の質問は、gdb が実際の文字列ではなく ASCII コードを返す理由と、gdb が文字列を表示するようにオプションを変更する方法です。

そして、もう 1 つの質問:ESPレジスタがスタックの一番下を見て、そのアドレス Amovl $0x80484d0,(%esp)を参照していることはわかっていespます。一部の情報が設定されている場合、A + サイズの x80484d0 に変更しespないでください。スタックの一番下を見るにはespこの画像は私の質問をより明確にするはずです。私はどこかで間違っていることを知っています。ありがとうございました。esp

0 投票する
1 に答える
1184 参照

python - スタック フレーム間を上下に移動する方法は?

を使用してスタック フレームを取得するとしますsys._getframe(1)。これは明らかに現在のフレームではありません。

ここで、何らかの方法で、外側のスタック フレームに移動し、多分x=10のようなステートメントを実行して、そのフレームに変数を作成したいと考えています。

そのように変数を設定するのは良い習慣ではないことは理解していますが、それは他のステートメントかもしれません。で、肝心なのはそのコマにどう動くかです。with(frame)動作しないようです。

それは可能だと思いますが、そうでなければ、モジュール内にgetinnerframesとという 2 つの関数があるのはなぜですか? 外側のフレームに移動できない場合、なぜ内側のフレームを使用する必要があるのですか?getouterframesinspect

編集:モジュールには、ドキュメントが言ってpdbいる上下に2つのコマンドがあります

d(own) スタック トレース内で現在のフレームを 1 レベル下に (新しいフレームに) 移動します。

u(p) スタック トレースで現在のフレームを 1 レベル上に (古いフレームに) 移動します。

これは私の場合に役立ちますか?はいの場合、どのように使用しますか?

0 投票する
1 に答える
4490 参照

c - x86_64 : スタック フレーム ポインタはほとんど役に立たない?


  • Linux x86_64。
  • gcc 5.x

-fomit-frame-pointer を使用する場合と使用しない場合の 2 つのコードの出力を調べていました ("-O3" の gcc は、デフォルトでそのオプションを有効にします)。

私の質問は:

そのオプションをグローバルに無効にすると、極端な場合でもオペレーティング システムをコンパイルする場合でも問題はありますか?

割り込みがその情報を使用することを知っているので、そのオプションはユーザー空間にのみ適していますか?

0 投票する
1 に答える
1362 参照

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.__fpfp ( ) が正しいフレーム ポインタではないことを証明するにはどうすればよいですか?

  1. パラメータが現在のスレッド、たとえば mach_thread_self() の場合、fp は常に 0__builtin_frame_address(0)であり、これは;とは異なります。

  2. パラメーターが現在のスレッド (メイン スレッドなど) でない場合、前のフレーム ポインターへのポインターはfp、2 つまたは 3 つのフレームで NULL になります。これは、スタック フレームの通常のリンク リストには短すぎます。

  3. まだ現在のスレッドではありませんが、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。しかし、任意のスレッドでこれを行う方法は?