問題タブ [instrumentation]
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.
.net - java.lang.instrument によって提供される機能の .Net アナログはありますか?
PostSharp、bltoolkit、Castle、Cecil、Microsoft の Policy Injection Block など、よく知られている .Net 用の AOP 指向のフレームワークをいくつか見てきました。おそらく私は無知ですが、これらのフレームワークは、クラスが仮想マシンによってロードされている間、アプリケーションに表示される前にコードを挿入する機能を提供していないようです。それらはすべて、アセンブリのコンパイル時の操作に必要なメタデータを提供するファクトリまたはクラス/メソッド レベルの属性のアプリケーション使用に依存しているようです。私が探している java.lang.instrumentの重要な機能は、ソース (メソッド/クラスの属性) を変更したり、既存のアセンブリを再構築してインターセプト コードを挿入したりせずに、メソッド呼び出しの周りにインターセプターを単純に挿入することです。
.net - ASP.NETWebアプリケーションでのコードインストルメンテーション
私は一般的に.NET開発にかなり慣れていません。特にキャッシングに関連して、パフォーマンスを調整するためにWebアプリケーションでいくつかのインストルメンテーションを実行したいと思います。動的に生成されたカスタムのUserControlをたくさん作成しましたが、さまざまな方法でキャッシュを試してみたいと思います。おそらくASPXページ宣言またはプログラムによるものです。
また、相互に依存するOracleクエリがたくさんあるので、それらのキャッシュ結果を調べて、何が最高のパフォーマンス向上をもたらすかを確認したいと思います。
これについて行くための最良の方法は何でしょうか?どういうわけか、ストップウォッチウォッチングを使用して、IEがページの読み込みにかかる時間を確認するのは最善の方法ではないと思います。認識された遅延を除けば、キャッシュがヒットしたのか、見落とされたのかはわかりません。VS2008には、支援するためのツールが組み込まれていますか?
oracle - PL/SQL ロギング - 制御方法
DBMS_OUTPUT の使用を置き換えるために、既存の Oracle アプリケーションにロギング フレームワークを導入しようと考えています。
フレームワークは、主にデバッグを支援するために使用され、x プロシージャの開始、パラメーターの詳細、プロシージャ x の終了などの詳細を示します。また、すべてまたは 1 つのプログラム ユニット、さまざまなレベルのトレースに対して有効にする機能も備えている必要があります。実際、ほとんど標準的なロギング機能です。
これらの要件の実装は比較的簡単ですが、この機能をオフまたはオンにする最善の方法を教えてください。私が達成しようとしているのは、トレースがオフになっているときのパフォーマンスへの影響を最小限に抑えることです。うまくいけば、ほとんどの場合はそうなるはずです!
アプリケーションは 10g リリース 2 を使用しているため、最初はロギング メカニズムを条件付きコンパイル内にラップして、通常の操作中にロギング フレームワークが表示されないようにする外観が気に入りました。残念ながら、ほとんどのアプリケーションはスタンドアロンのプロシージャと関数を使用して構築されているため、このアイデアをしぶしぶ放棄する必要がありました。そのため、ログ機能をオンにすると多くのコードが無効になる可能性があります。
インスピレーションを得るために、いくつかの既存のオープンソースと他のフレームワーク\機能を調べました。
log4plsql ( http://log4plsql.sourceforge.net/ )
ここでのAPCのレビューは 、特に許容できる影響の下で、私に懸念を与えます.
OraLog プロジェクト ( http://oralog.sourceforge.net )
2007年以降更新なし
PL/VISION(こちら)
かなり古いように見えますが、Oracle 8i から変更はありませんか?
Tom Instrumentationに問い合わせる(ここ)
更新 01/04/2014 Tom Kyteが Tyler Muth のLoggerを推奨
なんらかの形式のログインを Oracle アプリケーションに導入した場合、それをどのように実装したか、特にどのように制御したかについて、その経験をお聞きしたいと思います。
java - 動的バイトコード計測 - 問題
解決できない問題があります。次の 2 つのクラスと継承関係があるとします。
次のように追加のコードを計測したいと思います。
java.lang.instrument
この目標を達成するために、独自のクラス ファイル トランスフォーマーを備えたエージェントを使用して、パッケージに基づいて実装しました。このメカニズムは、動的バイトコード インストルメンテーションとも呼ばれます。
これまでのところ簡単です。さて、私のテストメソッドは次のことを行います:
コード:
これは、インスツルメンテーション パッケージの次の制限により機能しません。 を呼び出すnew B()
と、インストルメンテーションはクラス B で開始され、スーパー クラス A にはまだ print() メソッドがないため、操作されたクラスをロードするときにコンパイル エラーになります。クラス B の前にクラス A のインスツルメンテーションをトリガーできるかどうか、またどのようにトリガーできるかという問題が生じます。classfiletransformer の transform() メソッドは、クラス A で明示的に呼び出す必要があります。だから私は読み始めて、これにぶつかりました:
のjava.lang.instrument.ClassFileTransformer.transform()
javadocは言う:
トランスフォーマーは、すべての新しいクラス定義とすべてのクラスの再定義に対して呼び出されます。新しいクラス定義のリクエストは ClassLoader.defineClass で行われます。クラスの再定義の要求は、Instrumentation.redefineClasses またはそのネイティブの同等物で行われます。
transform メソッドにはクラスローダーのインスタンスが付属しているので、B のインストルメンテーションが開始されたときにクラス A を使用して自分でloadClass
メソッド ( loadClass
calls )を呼び出してみませんか。defineClass
その結果、instrument メソッドが呼び出されることを期待していましたが、残念ながらそうではありませんでした。代わりに、A
インストルメンテーションなしでクラスがロードされました。(エージェントはロード処理をインターセプトするはずですが、インターセプトしません)
この問題を解決する方法はありますか?一部のバイトコードを操作するエージェントが別のクラスを手動でロードできず、そのクラスがその/任意のエージェントを介して送信される可能性がない理由がわかりますか?
B が操作される前に A が読み込まれ、インストルメント化されているため、次のコードは適切に機能することに注意してください。
どうもありがとう!
java - メソッドの開始/終了のためのASMバイトコードインストルメンテーション
次のことを高レベルで実行するJVMTIエージェントを作成しました。
onClassLoadHookは、ロードされたクラスのバイトコードを、ASMを使用してクラスをインストルメント化する別のJavaプロセスに送信します
バイトコードを取り戻し、それらをロードします
ロードされたJavaクラスをインストルメント化する別のJavaプロセスでは、次のことを行います。
...。
Java Decompilerを使用して、このインストルメンテーションの後に記述されたクラスを逆コンパイルしようとすると、次の逆コンパイルされた関数が間違っていることがわかります。
私の関数は実際には次のようになっているためです:
私がここで何か間違ったことをしたかどうか誰かに教えてもらえますか?私の唯一の手がかりは、関数に引数としてTHISポインターを渡す代わりに、プリミティブ型を渡すと、すべてがうまくいくということです。私が管理する必要があるこのポインターについて何か特別なことはありますか?バイトコードを比較し、ASMIFIERを使用して、適切なバイトコードを生成するために使用する必要のあるステートメントに関する手がかりを得ました。
java - Java プログラムがリフレクションを使用してロードするすべてのクラスの名前を見つける
静的分析ツールをサポートするために、リフレクション呼び出し (Method.invoke(..) など) ごとに判断できるように、Java プログラムを計測または監視したいと考えています。
1.) このメソッドが呼び出されるクラス C、および 2.) このクラス C をロードしたクラスローダ。
理想的には、Java ランタイム ライブラリを静的に変更する必要のないソリューション、つまりロード時のソリューションを探しています。ただし、このソリューションは、Java ランタイム ライブラリ自体で発生するような呼び出しであっても、すべてのリフレクション呼び出しをキャプチャできる必要があります。(ClassFileTransformer をいじってみましたが、これは ClassFileTransformer 自体が依存していないクラスにのみ適用されるようです。特に ClassFileTransfomer はクラス「Class」には適用されません。)
ありがとう!
java - AnnotationProcessorからのバイトコードの読み取り
重複の可能性:
Javaコンパイラへのプラグイン
編集-これはJavaコンパイラへのプラグインの複製のようです
クラスをバイトコードにコンパイルした後に呼び出され、バイトコードを読み取って変更できるツールでAnnotationProcessor
使用するためのを実装したいと思います。apt
これを行う理由は、注釈付きメソッドを別の言語に翻訳し、Javaメソッドを翻訳されたバージョンを呼び出すスタブに置き換えたいためです。
ただし、AnnotationProcessorEnvironment
インターフェイスは新しいクラスを生成するメソッドのみを提供し、前のラウンドで生成されたクラスファイルを読み戻すことはできません。
インストルメンテーションAPIは、実行時にのみ、私が望むものと同様のことを行います。コンパイル時にこれを行う方法を探しています。
java - Javaベリファイアエラーを生成するバイトコードインストルメンテーション
Javaプログラムのバイトコードインストルメンテーションを行うためにASMを使用しています。私がしていることは単純です-メソッドをインストルメント化するとき、命令がPUTFIELDの場合、命令の直前にDUP_X1を実行し、次にPUTFIELDにアクセスして、DUPされたスタックエントリを含む引数を使用して関数呼び出しを挿入します。
コードは、それぞれインストルメンテーションの前と後のようになります。
しかし、インストルメント化されたコードを実行すると、次のようになります。
java.lang.VerifyError:スタック上でオブジェクト/配列を見つけることを期待しています
これについて何か助けがありますか?
windows-7 - Win7 とインストルメンテーションの最初のステップ
こんにちは、前回の pdc で示したように、私たち開発者は SO 機能を利用してコードにインストルメンテーションを追加できます (ベスト プラクティスに基づく)。そのセッションでは、新しい Windows PowerShell ベースのトラブルシューティング プラットフォームと、複数のデータ ソースを簡単に監視して、エンド ユーザーと IT プロフェッショナルがソフトウェアの問題を検出して解決できるようにする方法を紹介します。しかし、デモはアップロードされませんでした。Win7 でインストルメンテーションを使用して "コードを書く" 方法や、私のコードがソフトウェアの品質を向上させるのにどのように役立つかをいくつかの prof ツールでデモンストレーションする方法を知りたいです。
Windows 7 for Developers Training Kit も試してみましたが、デモは明らかに WMI を使用していません。
ありがとう
javascript - Firefox の JavaScript プロファイル
(何人かがすでに js プロファイルについて質問していることは知っていますが、それらを正しく理解していれば、それは私が必要とするものではありません。)
javascriptの実行をトレースして、1)どの関数が呼び出されたのか、2)関数が呼び出された時刻、3)関数の実行時刻の情報を収集したいと考えています。
情報をオンラインで (デプロイされたコードで) 収集したいが、社内では収集したくない。したがって、トレードオフは軽くなければなりません。また、関数が呼び出される前後に手動で行を追加したくありません。ただし、コードを動的に計測できる方法があれば素晴らしいでしょう。
前もって感謝します!