問題タブ [ftrace]
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.
android - Android FTrace の精度をマイクロ秒に上げる方法は?
以下を使用して、 Android環境内でFTraceファイルを生成しようとしています。
問題は、mytracefile.txtのタイム スタンプの精度がミリ秒単位であることです。
通常、14186.690000ではなく 14186.691234 のように、マイクロ秒単位である必要があります。
私が持っている他のすべてのtrace_clock オプション( local、global、および counter )は既にテストしましたが、結果は常に同じです。そのパラメーターを変更しても、出力ファイルは何も変更されません。
FTrace のドキュメントに注意深く従いましたが、構成で他に何を変更すればよいかわかりません。
インターネットで検索すると、このバグレポートしか見つかりませんでしたが、解決されませんでした: http://lists.linaro.org/pipermail/linaro-dev/2011-February/002720.html
何かアドバイスはありますか?
インストールする必要があるカーネルに追加のモジュールはありますか?
アップデート:
- Android バージョン: 4.2.2
- カーネル Linux バージョン: 3.4.7
dmesg出力もミリ秒の精度を示しています。
ありがとうございました、
android - FTRACE を使用してソフトウェア ハングをデバッグする
FTRACE を使用してソフトウェア ハングの問題をデバッグするにはどうすればよいですか? ソフトウェアがハングした後は、busybox シェルで何も入力することさえできないと思います。トレースをSDカードなどに保存する方法はありますか?
ありがとう
linux-kernel - これらのトレース イベントは何を表していますか?
ftrace と perf の使い方を学んだばかりですが、それらに共通していて理解できないことがいくつかあります。トレース イベントです。それらはいくつかのカーネル内部関数であると思います.ftraceは、それらが有効になっている場合、呼び出されたときにそれらの名前を記録します. そうですか?すべてのイベントは、以下にリストされているグループに分類されます。彼らが何を表しているのか、どこで詳細な情報を入手できるのか誰か教えてくれませんか? どうも。
ブロック btrfs コンパクション drm ext3 ext4 fs ftrace gpio header_event header_page irq jbd jbd2 kmem mce モジュール napi ネット パワー raw_syscalls rcu regmap レギュレータ rpm sched scsi シグナル skb sock syscalls タイマー udp vfs vmscan vsyscall ワークキュー ライトバック xen xfs
linux - ftrace を使用してシェル コマンドのすべてのイベントをトレースする方法は?
cp file1 file2
ftrace ツールを使用するようにコマンドをトレースするにはどうすればよいですか?
使用時に呼び出されたすべての関数を表示したいのですが、cp file1 file2
方法がわかりません。誰かが私を助けて、それを行う端末で正確なコマンドを書き留めることができますか?
linux - ftrace と kprobes を使用して (仮想アドレス変換を使用して) ユーザー空間アセンブリをキャプチャしますか?
長い投稿で申し訳ありません。短い方法で作成するのに苦労しています。ftrace
また、これは Unix & Linux Stack Exchange に適しているかもしれませんが、タグがあるので、まずここで試してみます。
function_graph
とにかく - ユーザー プログラムの機械語命令がを使用したフル キャプチャのコンテキストで実行されることを確認したいと思いますftrace
。1 つの問題は、古いカーネルにこれが必要なことです。
...そして、この版ではUPROBES
、Uprobes in 3.5 [LWN.net]が指摘しているように、そのようなことができるはずです。(元のカーネルにパッチを当てる必要がない限り、User-Space Probes (Uprobes) [chunghwan.com]が示しているように、ツリーから構築されたカーネル モジュールを試しても構わないと思っています。私は0から見ることができます: Inodeベースのuprobes [LWN.net]、2.6にはおそらく完全なパッチが必要です)
ただし、このバージョンでは/sys/kernel/debug/kprobes
、および/sys/kernel/debug/tracing/kprobe_events
;があります。Documentation/trace/kprobetrace.txtは、kprobe をアドレスに直接設定できることを意味します。これがどのように使用されているかの例がどこにも見つからなくても。
いずれにせよ、どのアドレスを使用すればよいかはまだわかりません。小さな例として、プログラムのmain
関数の開始をトレースしたいとしましょう(以下に含まれています)。wtest.c
これを実行して、機械語命令のアセンブリ リストをコンパイルして取得できます。
このスクリプトを使用して ftrace ロギングを設定します。
デバッグで (そうでなければ複雑な) 結果のftrace
ログ の一部を見ることができます- カーネル空間でのハードディスク書き込みの観察 (ドライバー/モジュールを使用) - Unix & Linux Stack Exchange (例を入手した場所)。
基本的に、0x8048474、0x8048475、0x8048477、0x804847a、0x804847d、0x8048483、および 0x8048487ftrace
の最初の命令が (任意の) CPU によって実行されたときに、このログに出力したいと思います。問題は、 Anatomy of a Program in Memory : Gustavo Duartemain
から理解できる限り、これらのアドレスは、プロセス自体の観点から見た仮想アドレスです (そして、私が収集すると、同じ観点が によって示されます)。 ..どうやら、物理的な住所が必要なのでしょうか?/proc/PID/maps
krpobe_event
したがって、私の考えは次のようになります。プログラムの逆アセンブリの仮想アドレスに対応する物理アドレスを見つけることができれば (たとえば、pid とアドレスを受け入れ、procfs を介して物理アドレスを返すカーネル モジュールをコーディングすることによって)、設定できます。上記のスクリプトを介して一種の「トレースポイント」としてアドレスを/sys/kernel/debug/tracing/kprobe_events
取得し、うまくいけばftrace
ログに記録されます。原則として、これは機能しますか?
これに関する1つの問題は、Linux(ubuntu)、C言語で見つかりました:仮想アドレスから物理アドレスへの変換 - スタックオーバーフロー:
ユーザー コードでは、仮想アドレスに対応する物理アドレスを知ることはできません。これは、単にカーネルの外部にエクスポートされない情報です。特にカーネルがプロセスのメモリの一部をスワップアウトすることを決定した場合は、いつでも変更される可能性があります。
...
systemcall/procfs を使用して仮想アドレスをカーネルに渡し、vmalloc_to_pfn を使用します。procfs/registers を介して物理アドレスを返します。
ただし、vmalloc_to_pfn
些細なことでもないようです。
VA: vmalloc_to_pfn: 0x36f7f7fc を使用する 0xf8ab87fc PA。しかし、私は実際に期待しています: 0x136f7f7fc.
...
物理アドレスは 4 ~ 5 GB です。しかし、正確な物理アドレスを取得することはできません。切り捨てられた 32 ビット アドレスしか取得できません。真の物理アドレスを取得する別の方法はありますか?
したがって、kprobes によって追跡される物理アドレスをどの程度確実に抽出できるかはわかりません。特に「いつでも変更される可能性がある」ためです。しかし、ここでは、プログラムが小さくて些細なことなので、トレース中にプログラムがスワップされない合理的な可能性があり、適切なキャプチャが得られることを願っています。(したがって、上記のデバッグ スクリプトを複数回実行する必要がある場合でも、10 回に 1 回 (または 100 回でも) 「適切な」キャプチャを取得できることを期待できる限り、問題ありません。 )
ftrace
タイムスタンプが同じドメインで表現されるように、を介して出力が必要であることに注意してください (信頼できる Linux カーネルのタイムスタンプ (またはその調整) と両方の usbmon と ftrace? -タイムスタンプに関する問題の図については、スタック オーバーフローを参照してください)。したがって、たとえば、ユーザー空間からプログラムを実行およびトレースするためのスクリプトを考え出すことができたとしてもgdb
(同時にキャプチャが取得されます)、それ自体からのオーバーヘッドがログに表示さftrace
れるため、それを避けたいと思います。.gdb
ftrace
つまり、要約すると:
- 仮想(実行可能ファイルの逆アセンブリから)アドレスから(おそらく別のカーネルモジュールを介して)物理アドレスを取得するアプローチはありますか?もしそうなら、このアドレス変換の目的で使用できるカーネルモジュールの例はありますか?
- 特定のメモリアドレスが実行されているときに、カーネルモジュールを使用してコールバック/ハンドラ関数を「登録」できますか? 次に
trace_printk
、その関数で a を使用してftrace
ログを取得するだけで (または、それがなくても、ハンドラー関数名自体がftrace
ログに表示されるはずです)、それでオーバーヘッドが多すぎるとは思われません...
実際、この 2007 年の投稿、Jim Keniston - utrace ベースの uprobes: systemtap メーリング リストには、11. Uprobes Example
(に追加されたDocumentation/uprobes.txt
) があります。これは、まさにそのように思われます - ハンドラー関数を登録するカーネル モジュールです。残念ながら、それはlinux/uprobes.h
;を使用します。kprobes.h
そして、私は私の中にしかありません/usr/src/linux-headers-2.6.38-16/include/linux/
。また、私のシステムでは、有効になっていないことsystemtap
について不平を言うことさえあります(このコメントを参照)...したがって、カーネルを再コンパイルしてuprobesを取得することなく、必要なデバッグトレースを取得するために使用できる他のアプローチがある場合、それは知ってよかった...CONFIG_UTRACE
wtest.c
:
linux - リアルタイム Linux のカーネルモードで割り込み時刻 (タイムスタンプ) を取得するには?
クライアント/サーバー通信 - クライアントが送信側でサーバーが受信側です。
サーバーがイーサネット インターフェイス (UDP) でデータを受信すると、サーバーのカーネルがトリガーされます。サーバー側でリアルタイム LINUX を使用しています。サーバー (つまり、組み込みの pc ターゲット) は割り込みを処理して、組み込みの pc ターゲット (rt Linux を含む) をトリガーし、新しく到着したデータを実行するよう注意を引きます。
割り込みが発生するとすぐにカーネルで時間を計算し、クライアントに応答を返すにはどうすればよいですか?
debugging - FTRACE は、メモリ内のコード命令を変更した後、CPU 命令キャッシュを無効にしますか?
よく知られているように、カーネルは「mcount」をプレースホルダーとして使用して、FTRACE 操作中に CPU 命令の実行をリダイレクトします。例えば:
上記から、命令「call mcount」は、FTRACE 操作中に他の命令に動的に置き換えられます。
問題は、CPU が実行前に常に特定の数の命令をキャッシュにプリロードすることを考えると、カーネル メモリ内の命令置換がどれほど安全かということです。また、命令をロードした後、FTRACE 操作によってメモリ内の命令が置き換えられる場合があります。しかし、CPU は引き続きキャッシュされたバージョンを実行しますよね? または、FTRACE は、メモリの内容を変更した直後に CPU 命令/データ キャッシュの無効化をトリガーしますか? (カーネルソースコードのリファレンスを提供してください?)
ありがとう。
PS: 参照: http://people.redhat.com/srostedt/ftrace-tutorial.odp (スライド 36 と 37 は、関数で FTRACE が有効になっている場合のメモリ内での命令操作を示しています)
android - Android スケジューラの分析 - プロセスは自己起動しますか?
現在、スケジューラのスレッド ウェイクアップ フローを理解するために、ftrace (具体的には Android の atrace 経由) を使用しています。ただし、以下の行は私を混乱させます。これは、現在のタスク (ls-4787) がそれ自体 (comm=ls pid=4787) を起動していることを示しています。
なぜ、またはどのようにこれが起こるのでしょうか? 現在実行中のプロセス (既に実行キューに入っています!) が... 自分自身をキューに追加する状況は考えられません。私はこれを間違って読んでいますか?あなたが提供できるかもしれない助けをありがとう!
補足として、これらの特異なインスタンスは常に kworker イベントと結合しているように見えますが、スケジューラーの観点からこれが影響を受ける理由はわかりません。