問題タブ [ngen]
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.
installation - Visual Studio 2012 のインストール: ngen がハングする/何もしない
Visual Studio 2012 Professional RC (Windows 7 x64 で VS 11 Beta からアップグレード) をインストールしようとしましたが、インストーラーが一見任意の時点で「ハング」しているように見えます。インストーラーの UI は完全にレスポンシブであるため、引用符を使用します。ただそこに座って、それ以上進むことを拒否しているようです。私が観察したことは次のとおりです。
- msiexec.exe (32 ビット、SYSTEM として実行) のインスタンスは、4 つのコアの 1 つを固定します。
- vs_professional.exe の 2 つのインスタンスが実行されているようです (両方とも私の ID を使用しています)。それらの 1 つ (メインの UI インスタンス) は、おそらく進行状況バーを更新する必要があるかどうかを確認するために業務を行っている間、常に 1 ~ 2% の CPU を使用しています。他のインスタンスはまったく CPU を使用していないようです。
- ngen.exe のインスタンスが何もせずに座っているように見えます。つまり、CPU を使用していません。
セットアップを実行してログ ファイルの場所を指定すると、インストーラーが正常にインストールされたすべてのコンポーネントのログ ファイルを生成することがわかります。「ハング」するパッケージに到達すると (インストーラーを実行するたびに異なります)、共通点は、インストール中に ngen.exe を呼び出してネイティブ イメージを生成したことです。 このハングは、インストール、アンインストール、修復のいずれをしようとしても発生します
マシンを一晩、場合によっては最大 16 時間放置してみましたが、戻ってきても同じポイントで動かなくなります。UI からセットアップをキャンセルすると、UI に「現在のセッションを停止しています」というメッセージが表示されますが、何も起こらないようです。ngen.exe プロセスを強制終了すると、ログ ファイルで、インストーラーが別のネイティブ イメージの生成/アンインストールに移行し、再びハングすることがわかります。UI で [キャンセル] をクリックした後に非アクティブな vs_professional.exe を強制終了すると、インストールが正常に終了し、「Y 個中 X 個のコンポーネントが正常にインストール/アンインストールされました」というメッセージが表示されます。
アイデア/提案はありますか?この混乱を片付けようとして頭がいっぱいです!
.net - インストーラーなしのNgen
以前はNGenを使用していませんでしたが、WPFアプリケーションの起動パフォーマンスを改善する必要があります。私が理解しているように、一般的なケースは、アプリケーションのインストール中にngenを実行することです。しかし、私のアプリケーションは社内のニーズに使用されており、インストーラーはありません(複雑になるだけです)。
ngenを実行する他の方法はありますか?初めてアプリケーションを起動したときに実行するとどうなりますか?そのための管理者権限が必要ですか?
.net - コールドおよびウォームスタートアップのJITとNGen
JITとNGenの違いを理解しようとしています。助けてください。JITはバイナリコードをキャッシュしますか?はいの場合、NGenはコールドランのパフォーマンスのみを改善できることを意味します。しかし、私は反対のことを言っているいくつかの記事を読みました:NGenはウォームスタートアップだけを大幅に改善します。
.net - .NET 4.0 NGEN x64 アセンブリでのシンボルの解決が機能しない
x64 NGEN .NET 4.0 アセンブリでのシンボルの解決が機能しません。
詳細:
x64 構成の Visual Studio を使用してコンパイルしている .NET 4.0 コマンド ライン アセンブリがあります。コンパイルしたら、NGEN (64 ビット版) を実行します。
シンボルを解決しないコールスタック (-stackwalk プロファイルを使用) を分析する XPERF で失敗しました。ここから Perfmonitor を試しています: http://bcl.codeplex.com/releases/view/42784
私はこれらの手順を実行しましたが、コール スタックが解決されることを期待していました。
- NGEN 化された x64 アプリを起動する
- PerfMonitor 収集
- パフォーマンス モニターのマージ
- パフォーマンスモニター分析
... 残念ながら、スタック トレースは PerfMonitor でも機能しません。
また、アプリを 32 ビットとして実行してみました - 同じ問題。私のシンボルは symchk /v で正常にチェックアウトされます
この壊れたスタック トレース機能をデバッグする方法がわかりません。
.net - Process Explorer はどのようにアセンブリ フラグを決定しますか?
ここに表示されているこれらのフラグを Process Explorer がどのように決定するか知っている人はいますか?
このための .NET API はありますか?
私はネイティブ フラグに特に興味があります。CodeBase
orLocation
プロパティでこれを特定しようとしました。しかし、これらはネイティブ イメージのパスではなく、常に DLL のパスのみを返すようです。
何か案は?私は立ち往生しています。
.net - app.config で supportedRuntime 要素を使用する場合、どの ngen.exe を使用すればよいですか?
.net 2.0 および .net 4.0 用の ngen.exe を、NSIS インストーラー内の .net 3.5 アプリケーションにバンドルしています。他に方法が見つからないのでまとめます。
app.config ファイルに以下があります。
上記のコードを持たない他の app.config も使用しています。その他の app.config は、PC に .net 3.5 がインストールされている場合にのみ使用されます。私の質問は、ユーザーが .net 3.5 をインストールしていない場合、どのバージョンの ngen.exe を使用すればよいですか?
ngen - WPF アプリケーションで Ngen.exe を使用するには?
ロードに時間がかかるため、WPF ページの起動パフォーマンスを向上させたい。Ngen.exe はパフォーマンスを向上させるかどうか、および WPF アプリケーションでどのように使用できますか
.net - NGEN を使用して RemoteAPP アプリケーションを更新する正しい方法
RDS サーバー上に NGEN 化された Windows2008R2 RemoteAPP .NET 4.5 アプリケーションがあります。3 ホストの NLB クラスターで 300 人の同時ユーザー。
アプリケーションは活発に開発されており、RemoteAPP で展開されたアセンブリを頻繁に更新する (つまり、新しいアセンブリに置き換える) 必要があります。
現在、これを行う方法は次のとおりです。
- ユーザーが接続しているRemoteAPPサーバーで変更するファイルの名前を変更します(OSは、ファイルがロードされている場合、ファイルの上書きを許可しません)。
- 古いファイルの代わりに新しいファイルを書き込み、
- NGEN は新しいアセンブリをインストールします (最初に古いアセンブリをアンインストールせずに!)、
- アプリのバージョンが変更され、再起動する必要があることを (アプリ自体を介して) ユーザーに通知します。
- ユーザーが自分のペースでアプリを再起動できるようにします (アプリを同時に再起動すると、ディスクと CPU の負荷が増加し、サーバーのパフォーマンスが低下します)。クラスタ内のすべてのホストについても同様です。
この後、サーバーは時折、Microsoft-Windows-Kernel-Power EventID 41 の重大なエラーでブルー スクリーン クラッシュすることがありました。
したがって、質問: 古いアセンブリにアクセスするプロセスを終了する必要なく、RemoteAPP アプリケーションを更新し、新しいアセンブリを NGEN する推奨される方法は何ですか (つまり、ユーザーが好きなときに続行して再起動できるようにする)。
ありがとうございました。
.net - JITされたアセンブリをデバッグするときにインスタンスフィールドを読み取る
ここ数週間、私はアンマネージ.NETデバッグAPIをいじっています。
MSDNはインターフェイス自体を文書化していますが、実際にそれらを意味のある方法で使用する方法を見つけるために、さまざまなブログ(主にMike Stall )とCLRマネージデバッガーサンプルおよびILSpyソースのマネージラッパーに頼りました。最終的に、実行中のプロセスにテストプログラムをアタッチし、ブレークポイントを設定してヒットすることができました。
次にやりたいのは、そのようなブレークポイントに到達することです。関連するオブジェクトインスタンスのフィールドを読み取ります。これは、デバッグターゲットメソッドがNGENまたはJITされていない場合に、NGENされたアセンブリの読み込みを無効にし(環境設定「COMPLUS_ZAPDISABLE = 1」)、JIT最適化を無効にする(別名「.iniファイルトリック」 )ことで正常に機能します。 )。
ただし、理想的なターゲットである小売用に最適化された(NGEN / JITされた)コードで同じことを試してみると、機能しません。たとえば、エントリブレークポイントをヒットしても、メソッド引数の数を取得できますが、最初の引数自体を取得できません(デバッグAPIは例外をスローします)。
さて、これの理由は、デバッグAPIがプラットフォームに依存しないことになっているためだと思います。この場合、アセンブリはもう存在しません。しかし、このプラットフォームのIntelへの依存関係を受け入れるとどうなりますか?CLRがfastcall呼び出し規約を使用していることを知っている限り、この場合、ECXレジスタには最初のメソッド引数(メンバー関数の暗黙の「this」参照)が含まれます。
私はこれをテストしましたが、実際にブレークポイントに到達すると、ECXにはNGENされたアセンブリにOBJECTREF(オブジェクトインスタンスのアドレス)が含まれます。
インスタンスフィールドを読み取る最後のステップは、このポインタを基準にしたフィールドオフセットを取得することです。これは、ネイティブコード生成中にCLRがインスタンスフィールドのパッキングをどのように行うかを知ることができないため、私が立ち往生している場所です。。
これはCLRのバージョン/実装に依存する可能性があることを認識していますが、SOS拡張機能を備えたWinDbgがこのレイアウトを見つけることができるため、明らかに方法があります。デバッグAPIを使用しない場合、どういうわけかSOS.dllを活用できますか?
c# - C# と ngen.exe を使用して Win32 のネイティブ イメージをビルドする方法
プレーンな C/C++ を使用して Win32 向けに開発している場合のように、C# からネイティブ アプリケーションを構築することは可能ですか。
ngen.exe のことを聞いて使ってみたのですが、何をしているのかわかりません。アプリケーションをキャッシュするのと同じように、迅速な迅速なシステムディレクトリであり、アプリケーションにいくつかの最適化を提供しますが、ネイティブイメージは生成しません。
「ネイティブ ジェネレーター」と名付けられたのはなぜですか。Win32 のネイティブ出力を生成せず、.net vm が必要なのですか?