問題タブ [callstack]

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 投票する
3 に答える
2981 参照

.net - .net のコール スタックへのプログラムによるアクセス

プログラムからコール スタックにアクセスするにはどうすればよいですか?

0 投票する
3 に答える
2923 参照

c++ - Visual Studio 2005 で完全なコール スタックを取得するには?

Visual Studio 2005 で開発された C++ アプリケーションの完全なコール スタックを取得するにはどうすればよいですか? システム ライブラリのコードを含む完全なコール スタックが必要です。

Visual Studio で一部の設定を変更する必要がありますか? または、追加のソフトウェアをインストールする必要がありますか?

0 投票する
7 に答える
10826 参照

c - コンパイル時のスタック使用量のチェック

C でコンパイル時に関数が必要とするスタックサイズを知り、出力する方法はありますか? これが私が知りたいことです:

いくつかの関数を取りましょう:

この関数をコンパイルするときに、関数が呼び出されたときにどれだけのスタック スペースが消費されるかを知りたいです。これは、大きなバッファを隠している構造体のオン スタック宣言を検出するのに役立つ場合があります。

私はこのようなものを印刷するものを探しています:

ファイル foo.c : 関数 foo スタックの使用量はnバイトです

それを知るために生成されたアセンブリを見ない方法はありますか? または、コンパイラに設定できる制限はありますか?

更新: 特定のプロセスのランタイム スタック オーバーフローを回避しようとしているわけではありません。コンパイラによって決定された関数スタックの使用がコンパイル プロセスの出力として利用可能かどうかを実行前に見つける方法を探しています。

別の言い方をすれば、関数にローカルなすべてのオブジェクトのサイズを知ることは可能ですか? 一部の変数は消えますが、上限は問題ないため、コンパイラの最適化は私の友人ではないと思います。

0 投票する
6 に答える
11375 参照

debugging - 実行時のコール スタック

ネイティブ C++ アプリケーションで実行時にコール スタックにアクセスしたいと考えています。私はIDEを使用していません。コール スタックを表示するにはどうすればよいですか?

更新: アプリケーション全体の多くのポイントから呼び出される関数があります。まれにクラッシュします。発信者の名前を取得してログに記録する方法を探していました。

0 投票する
3 に答える
686 参照

java - Java: Eclipse - 差分トレース

JUnit テストを含む 2 つのバージョンのプロジェクトがあります。ファイルの差分を見ると、これには明らかな理由はありませんが、テストは 1 つのプロジェクトではパスしますが、他のプロジェクトではパスしません。

しばらくの間、実行時にプログラム全体のトレースを記録してファイルに保存するプログラムがあるかどうか疑問に思っていました。これは、両方のテストのトレースが必要であり、それらを一緒に比較したいというまさにこの例では非常に便利です。

これを実行できる可能性のあるプログラムの方向性、または2つのプログラムの流れを比較できる方法を教えてもらえますか?

乾杯

0 投票する
5 に答える
15979 参照

vb6 - VB6でプログラムでコールスタックを取得することは可能ですか?

関数でエラーが発生した場合、特にその関数が12の異なる場所から呼び出された場合に、それに至る一連のイベントを知りたいです。VB6でコールスタックを取得する方法はありますか、それとも難しい方法で取得する必要がありますか(たとえば、すべての関数やエラーハンドラーのエントリをログに記録するなど)?

0 投票する
3 に答える
6240 参照

c++ - StackWalk64()をx64で正常に動作させるにはどうすればよいですか?

ある時点でコールスタックをウォークするC++ツールがあります。コードでは、最初にライブCPUレジスタのコピーを(RtlCaptureContext()を介して)取得し、次にいくつかの " #ifdef ..."ブロックを使用してCPU固有のレジスタ名をstackframe.AddrPC.Offset、... AddrStack...、および...に保存しますAddrFrame。 ..; また、Addr上記の3つの...メンバーのそれぞれに対して、...を設定しstackframe.Addrます.Mode = AddrModeFlat。(これは、しばらく前に出くわしたサンプルコードから借用したものです。)

x86バイナリでは、これはうまく機能します。ただし、x64バイナリでは、StackWalk64()は偽のアドレスを返します。 (APIが最初に呼び出されたとき、明らかに偽のアドレス値のみがAddrReturn(== 0xFFFFFFFF'FFFFFFFE-別名StackWalk64()の3番目の引数、GetCurrentThread()によって返される疑似ハンドル)に表示されます。APIが2回呼び出された場合ただし、すべてのAddr...変数は偽のアドレスを受け取ります。) これAddrFrameは、設定方法に関係なく発生します。

  • 推奨されるx64「ベース/フレームポインタ」CPUレジスタのいずれかを使用:rbp(= 0xf)、またはrdi(= 0x0
  • 使用rsp 中(動作することを期待していませんでしたが、とにかく試してみました)
  • 設定AddrPCし、通常はゼロのAddrStackままにします(他のサンプルコードで見られます)AddrFrame
  • すべてのAddr...値をゼロにして、StackWalk64()が渡されたCPUレジスタコンテキストからそれらを入力できるようにします(他のサンプルコードで見られます)

FWIWでは、物理スタックバッファーの内容もx64とx86で異なります(もちろん、ポインター幅とスタックバッファーの場所の違いを考慮した後)。理由に関係なく、StackWalk64()は引き続きコールスタックを正しくウォークできるはずです。つまり、デバッガーは引き続きコールスタックをウォークでき、StackWalk64()自体をバックグラウンドで使用しているように見えます。奇妙なことに、デバッガーによって報告された(正しい)呼び出しスタックには、ベースアドレスとリターンアドレスのポインター値が含まれ、その構成バイトは実際にはスタックバッファー(現在のスタックポインターの下または上)に存在しません。

(FWIW#2:上記のスタックバッファの奇妙さを考慮して、ASLR(/dynamicbase:no)を無効にして違いが生じるかどうかを確認しましたが、バイナリは同じ動作を示しました。)

それで。これがx86で正常に機能するのに、x64で問題が発生する理由はありますか?それを修正する方法について何か提案はありますか?

0 投票する
5 に答える
2591 参照

c++ - スタックを使用してメンバー変数を元の値にリセットする一般的な方法は?

クラスインスタンス変数を一時的に変更し、関数が完了したときにそれを復元する必要があるクラスインスタンス関数に出くわしました。関数にはあらゆる場所に return ステートメントがあり、それぞれの return の前に復元ステートメントがありました。例外がスローされたときの恐怖は言うまでもなく、それは私には面倒に思えました。

改善として、内部クラス定義を使用してこの一般化を思いつきました。サンプルのドライバ プログラム (クラス復元プログラム) を次に示します。

g++ 4.2.3 (-Wall) を使用した出力は次のとおりです。

これが「bエンド」に期待するものです。

クラス Unwind 内でクラス復元子を定義すると、誤用を思いとどまらせるのに役立つと感じました。

私の質問は、これを行うための一般的で安全な方法はありますか? 一生の問題で悩んでいます。

編集: スレッドはなく、この b_active_ フラグに基づいて動作を変更するスタック上の「ダウンストリーム」メソッドがあると想定してください。

0 投票する
7 に答える
91346 参照

objective-c - Cocoa のコンソール/ログにスタック トレースを出力するにはどうすればよいですか?

失敗したアサーションやキャッチされていない例外など、特定の時点でコール トレースをログに記録したいと考えています。

0 投票する
8 に答える
37637 参照

perl - Perl でコール スタック リストを取得するにはどうすればよいですか?

Perlスクリプトの現在の位置に先行するサブコールの任意の深さまでのサブ+モジュールのリストに(印刷用に)アクセスできる方法はありますか?

一部の Perl モジュール (.pm) を変更する必要があります。ワークフローは、Web ページから CGI スクリプトを介して開始され、いくつかのモジュール/オブジェクトを介して入力を渡し、データを使用する必要があるモジュールで終了します。どこかでデータが変更されたので、その場所を特定する必要があります。