問題タブ [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 - 最新のシステムにおけるスタックの成長の方向性は?
C でいくつかのトレーニング資料を準備しており、サンプルを典型的なスタック モデルに適合させたいと考えています。
Linux、Windows、Mac OSX (PPC および x86)、Solaris、および最新の Unix では、C スタックはどの方向に成長しますか?
c# - スタックフレームの実行オブジェクトを取得するにはどうすればよいですか?
リフレクションを使用する場合、System.Diagnostics.StackTraceを使用してコールスタックを取得し(それを除けば、JIT最適化により大まかな概算になる可能性があります)、含まれているStackFrameオブジェクトを調べることができます。
スタックフレーム内のメソッドが実行されているオブジェクト(thisポインター)への参照を取得するにはどうすればよいですか?
スタックフレームオブジェクトでGetMethod()を呼び出すことでMethodBaseを取得できることはわかっていますが、探しているのはGetObject()に沿ったものです(メソッドが静的な場合は自然にnullを返します)。スタックフレームオブジェクトは、メソッド情報、元のファイルなどの静的に決定された情報に対してのみクエリできるようです。
VSデバッガーは、呼び出しスタックウィンドウ内の任意のスタックフレームをダブルクリックして、ローカルフィールドとクラスフィールドの値を確認できるため、(おそらく呼び出しスタックトレースを取得する別の方法を使用しますが)認識しています。
編集:明確にするために:メソッドが呼び出されたオブジェクトインスタンスが必要です。つまり、メソッドFoo()が呼び出しスタックのどこかでオブジェクトインスタンスAで呼び出され、スタックトレースを実行するメソッドにカスケードされる場合、スタックトレースを実行する場所からAへの参照を取得したいと思います。(メソッドベースの宣言タイプではありません)
python - フレームオブジェクトから実行スタック上の関数オブジェクトへの参照を取得しますか?
の出力が与えられた場合inspect.stack()
、スタックフレームのどこからでも関数オブジェクトを取得してこれらを呼び出すことは可能ですか?もしそうなら、どのように?
(関数の名前を取得する方法はすでに知っています。)
これが私が得ているものです:私が関数であり、呼び出し元がジェネレーターであるか通常の関数であるかを判断しようとしているとしましょう。inspect.isgeneratorfunction()
関数オブジェクトを呼び出す必要があります。そして、誰があなたを呼んだかをどうやって理解しますか?inspect.stack()
、 右?ですから、どういうわけかそれらをまとめることができれば、私の質問に対する答えが得られます。おそらくこれを行うためのより簡単な方法がありますか?
c# - どのコード行が例外をスローしたかを判別する
dotNetでは、行が例外をスローしてキャッチされますが、どのファイルのどの行が例外をスローしたかをどのように把握できますか?比較的簡単に思えますが、理解できません...
c# - スタック、ヒープ、およびスタック フレームは概念的にどのように c# 構造にマップされますか?
スタック、ヒープ、およびスタック フレームは概念的にどのように c# 構造にマップされますか? それらはすべてどのように関連していますか?
c++ - スタックフレームの質問:JavaとC ++
Q1。Javaでは、すべてのオブジェクト、配列、およびクラス変数がヒープに格納されますか?同じことがC++にも当てはまりますか?データセグメントはヒープの一部ですか?
C ++の次のコードはどうですか?
Q2。私の理解では、コンパイラーによって特定の値が与えられた変数はデータセグメントに格納され、初期化されていないグローバル変数と静的変数はBSS(シンボルで始まるブロック)に格納されます。この場合、静的であるMyClass :: counterはコンパイラによってゼロに初期化されるため、BSSに格納され、100に初期化されたMyClass::numberはデータセグメントに格納されます。私は結論を出すのに正しいですか?
Q3。次のコードを検討してください。
私の質問をすべての人に明確にしたことを願っています
編集:
BSSの理解については、この記事を参照してください
編集1:クラス名が不適切な名前だったため、クラス名をMyInstanceからMyClassに変更しました。心からお詫び申し上げます
EDIT2:クラスメンバーの変数番号を非静的から静的に変更しました
c - ベースポインタとスタックポインタとは正確には何ですか? 彼らは何を指していますか?
DrawSquare() が DrawLine() を呼び出すウィキペディアからのこの例を使用すると、
(この図では、下部に上位アドレスがあり、上部に下位アドレスがあることに注意してください。)
誰かが私にこの文脈で何ebp
を説明できますか?esp
私が見たところ、スタック ポインターは常にスタックの一番上を指し、ベース ポインターは現在の関数の先頭を指していると思いますか? または何?
編集:これは、Windowsプログラムのコンテキストで意味します
edit2: また、どのように機能しeip
ますか?
edit3: MSVC++ の次のコードがあります。
それらはすべて dword のように見えるため、それぞれ 4 バイトを使用します。したがって、hInstance から var_4 までに 4 バイトのギャップがあることがわかります。彼らは何ですか?ウィキペディアの写真に見られるように、それは返送先住所だと思いますか?
(編集者注:質問に属さないマイケルの回答から長い引用を削除しましたが、フォローアップの質問が編集されました):
これは、関数呼び出しの流れが次のとおりであるためです。
私の質問 (最後、願っています!) では、呼び出したい関数の引数をポップした瞬間からプロローグの最後まで、正確には何が起こるのでしょうか? それらの瞬間にebp、espがどのように進化するかを知りたいです(プロローグがどのように機能するかはすでに理解しています。引数をスタックにプッシュした後、プロローグの前に何が起こっているかを知りたいだけです)。
c++ - c/c++ 参照スタック フレーム レイアウトによるポインター/引数による引数の受け渡し
コンパイラは、これらのステートメントの両方に対して同じコードを生成しますか?
単純に foo のスタック フレームのパラメータ部分にポインタを書き込むのでしょうか? または、2 番目のケースでは、呼び出し元と foos のスタック フレームがオーバーラップして、呼び出し元のローカル変数がスタック上で foo のパラメーターと同じメモリを使用するようになりますか?
assembly - アセンブリ内のスタック/ベースポインタ
私はこのトピックがここやインターネット上の他の場所で取り上げられていることを知っていますが、うまくいけば、私が集会に頭を悩ませようとしているので、質問は単純なものです...
したがって、正しく理解していれば、ebp(ベースポインター)はスタックの一番上を指し、esp(スタックポインター)は一番下を指します-スタックが下に成長するためです。したがって、espは「現在の場所」を指します。したがって、関数呼び出しでは、スタックにebpを保存したら、関数用の新しいスタックフレームを挿入します。したがって、下の画像の場合、N-3から開始した場合は、関数呼び出しを使用してN-2に移動します。しかし、あなたがN-2にいるとき、あなたのebp==25とesp==24ですか(少なくとも最初は、データがスタックに配置される前に)?
これは正しいですか、それとも私はここで接線を外れていますか?
ありがとう!
(出典:wikimedia.org)
python - 実行時の Python スクリプト行での関数呼び出しの識別
「exec」で実行するPythonスクリプトがあります。スクリプトによって関数が呼び出されたときに、その呼び出しの行番号とオフセットを知りたいと思います。
ここに例があります。私のスクリプトが次の場合:
そして、すべての関数で (line,offset) を出力するコードがある場合、取得する必要があります
ほとんどの場合、これはスタック フレームを取得することで簡単に実行できます。スタック フレームには行番号と関数名が含まれているからです。唯一の問題は、特定の行に同じ名前の関数が 2 つある場合です。残念ながら、これは私にとって一般的なケースです。何か案は?
元のコードを変更するのが最も簡単な解決策のようです。
次のような問題をどのように解決しますか
また
これには、あまり洗練されていないソリューションがいくつかあります。たとえば、前の例を自動的に次のように変更します。
もっとシンプルなアイデアがあれば教えてください。