問題タブ [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.
assembly - ゼロ以外のネスティング レベルで x86 の ENTER 命令を使用していますか?
x86 命令を考えてみましょうENTER
。Intelの命令セットリファレンスから。
プロシージャのスタック フレームを作成します。最初のオペランド (サイズ オペランド) は、スタック フレームのサイズ (つまり、プロシージャのスタックに割り当てられた動的ストレージのバイト数) を指定します。第 2 オペランド (ネスト レベル オペランド) は、プロシージャのレキシカル ネスト レベル (0 から 31) を指定します。ネスティング レベルは、前のフレームから新しいスタック フレームの「表示領域」にコピーされるスタック フレーム ポインタの数を決定します。これらのオペランドはどちらも即値です。
ENTER
ゼロ以外のネスティング レベルが 2 番目のオペランドとして渡されると、命令がどのように機能するのか疑問に思っていました。この場合、Intel のマニュアルによると、プロセッサは追加のフレーム ポインタをスタックにプッシュする必要があります。簡単に聞こえますが、サンプル プログラムで期待どおりに動作しない理由がわかりません。
次の例を FASM でコンパイルし、OllyDbg でデバッグしました。
ENTER
命令によって発行されるスタック フレームを以下に示します。
結果は奇妙です。gccでも同じことをしましょう。
エラー、わかりました...
私はおそらくそれがどのように機能するかを誤解しています。ここでの私の唯一の推測は、ENTER
命令が何らかの方法で OS によって処理されるということですが、これはほぼ間違いなく間違っています。
gcc - -O* を使用するときに GCC で RBP フレーム ポインタ レジスタの最適化を無効にする方法は?
プログラムを最適化するために使用gcc -O2
すると、gcc はレジスタ RBP の値を変更します。FRAME BASE REGISTERとして残しておきたいのですが、どうすればいいですか?
次の質問とは異なります: GCC: 一部のレジスタの使用を禁止する
java - Java ヒープとスタック
トピックが説明されているレッスンに参加できなかったため、次の演習に問題があります。YouTube でいくつかの動画を作成しようとしましたが、自分の結果に自信が持てませんでした。誰かが私を少し助けてくれたら、とても感謝しています。
次の Java コードが提供されます。
a) 指定されたプログラムに存在するすべての変数と関数の引数について、それらがヒープまたはスタックに配置されているかどうかを調べます。
b) 関数 f の開始後のスタックの状態を概説します。
次の結果が得られました。
a) n、m、v : スタック。args[] : ヒープ。
b) よくわかりません。ここで説明が欲しいです:/
前もって感謝します!
質問を宿題としてマークできませんでした。申し訳ありません。
c - その関数が実際に提供しない場合、関数呼び出しからの戻り値は何ですか
次のコードがあるとします。
私のコンピューターでは、文字列値 -1679929632 が出力されます。そして、実行すると時々変化します。
なぜこれが起こるのか誰でも説明できますか?
c - スタック フレームのサイズを返す C のポータブル関数 (アセンブリなし)
スタック フレームのサイズを返すポータブル関数を C で (アセンブリなしで) 記述します。
以下のように解決しようとしました - VS 2010 でコンパイルすると、この関数は 228 バイトを返します。その正確性を確認する方法はありますか?
次のように呼び出されます。
c# - C# の Iterator ブロックの StackFrame
イテレータ ブロックをコルーチンとして使用しています。つまり、列挙子 IEnumerator e; があります。e が初期化され、反復子ブロックの途中で、1 が返されました。コルーチンの実行を一時的に保留するために使用されました。
デバッグの目的で、e が生成された場所、つまり e のスタック フレームを取得することが望ましいです。デバッガーで表示することも、将来の検査のためにログに記録することもできます。
しかし、私が持っているのは IEnumerator インターフェイスだけで、3 つのメソッドと 1 つのプロパティしかありません。そして、それらを System.Diagnostics.StackTrace などに関連付ける方法がわかりません。
それは可能ですか、それとも可能であるべきですか?
編集: すぐに 2 つのコメントを受け取って、本当に聞きたい質問をクリアした後、正しい質問は次のとおりです。
生成された IEnumerator e があります。主にデバッグの目的で、再開された状態についてできるだけ多くの情報を取得する方法はありますか? ファイル名と行番号を合わせた MethodBase は完璧です。
c# - StackFrame コレクションを文字列に変換する方法は?
IEnumerable<System.Diagnostics.StackFrame> frames
カスタム StackFrame を保存するためのものがあります。StackTrace.ToString()
それを文字列型のようなフォーマットに変換したい。例えば:
c - 静的グローバル変数とグローバル変数 C
私は以下のプログラムを持っています。変数 a、b、c の静的グローバル変数を宣言すると、セグメンテーション違反が発生しますが、非静的グローバル変数またはローカル変数として宣言すると、セグメンテーション違反は発生しません。なぜそのような振る舞いをするのでしょうか。変数よりも多くのデータを格納できることはわかっていますが、宣言された static のみの場合に seg fault が発生するのはなぜですか? 静的に宣言された変数は、上書きが許可されていないスタック フレームの別の部分に格納されていますか?
編集: strcpy が安全でないことはわかっています。しかし、それは私の問題ではありません。1 つのオーバーフローで segfault が発生する理由と、もう 1 つのオーバーフローで segfault が発生しない理由を理解したい。