11

(編集:現在の「トリック」の下の最初の回答によると、Atomプロセッサを使用しているようです。しかし、これが根本的な制限であるか、または他のプロセッサのサポートを追加することがロードマップにあるかどうかについて、gdbの第一人者が答えてくれることを願っています。)

私の環境では逆実行が機能しているようです。

(gdb) start
...Temporary breakpoint 5 at 0x8048460: file bang.cpp, line 13.
Starting program: /home/thomasg/temp/./bang 

Temporary breakpoint 5, main () at bang.cpp:13
13    f(1000);
(gdb) record 
(gdb) continue 
Continuing.

Breakpoint 3, f (d=900) at bang.cpp:5
5     if(d) {
(gdb) info record 
Active record target: record-full
Record mode:
Lowest recorded instruction number is 1.
Highest recorded instruction number is 1005.
Log contains 1005 instructions.
Max logged instructions is 200000.
(gdb) reverse-continue 
Continuing.

Breakpoint 3, f (d=901) at bang.cpp:5
5     if(d) {
(gdb) record goto end
Go forward to insn number 1005
#0  f (d=900) at bang.cpp:5
5     if(d) {

ただし、命令と関数の履歴は利用できません。

(gdb) record instruction-history 
You can't do that when your target is `record-full'
(gdb) record function-call-history 
You can't do that when your target is `record-full'

利用可能な唯一のターゲット タイプは full であり、他の文書化されたタイプ「btrace」は「ターゲットはブランチ トレースをサポートしていません」で失敗します。

したがって、このターゲットではサポートされていない可能性が非常に高いですが、これは主流の最新のターゲット (gdb 7.6.1-ubuntu、amd64 Linux Mint「Petra」で「Intel(R) Core(TM) i5-3570」を実行) であるためです。 ) 重要なステップまたは構成を見落としていたらいいのにと思いますか?

4

2 に答える 2

7

それをサポートするCPU以外に解決策はないようです。

より正確には、カーネルが Intel Processor Tracing (Intel PT) をサポートしている必要があります。これは Linux で次のように確認できます。

grep intel_pt /proc/cpuinfo

参照: https://unix.stackexchange.com/questions/43539/what-do-the-flags-in-proc-cpuinfo-mean

コマンドはrecord btraceモードでのみ機能します。

GDB ソースの commitbeab5d9で、nat/linux-btrace.c:kernel_supports_pt入力できるかどうかをチェックするのbtraceです。以下のチェックが実行されます。

  • /sys/bus/event_source/devices/intel_pt/type存在するかどうかを確認し、type
  • syscall (SYS_perf_event_open, &attr, child, -1, -1, 0);読み取りを実行し、typeそれが返されるかどうかを確認します>=0。TODO: C ラッパーを使用しないのはなぜですか?

最初のチェックは失敗しました。ファイルが存在しません。

カーネル側

カーネル 4.1 ソースに cd し、次のようにします。

git grep '"intel_pt"'

arch/x86/kernel/cpu/perf_event_intel_pt.cそのファイルを設定するものを見つけます。特に、次のことを行います。

if (!test_cpu_cap(&boot_cpu_data, X86_FEATURE_INTEL_PT))
    goto fail;

intel_pt前提条件でもあります。

私が見つけた方法kernel_supports_pt

最初の grep:

git grep 'Target does not support branch tracing.'

につながりbtrace.c:btrace_enableます。次の方法で簡単にデバッグした後:

gdb -q -ex start -ex 'b btrace_enable' -ex c --args /home/ciro/git/binutils-gdb/install/bin/gdb --batch -ex start -ex 'record btrace' ./hello_world.out

仮想ボックスもサポートしていません: VirtualBox VM の gdb レコードから実行ログを抽出します。

インテル SDE

Intel SDE 7.21には既にこの CPU 機能があり、以下で確認しました。

./sde64 -- cpuid | grep 'Intel processor trace'

しかし、Linux カーネルを実行できるかどうかはわかりません: https://superuser.com/questions/950992/how-to-run-the-linux-kernel-on-intel-software-development-emulator- sde

その他の GDB メソッド

効率の悪いソフトウェア ソリューションを使用した、より一般的な質問:

于 2015-08-04T16:08:55.213 に答える
1

少なくとも部分的な回答(「私は間違っていますか」という側面について)- gdb-7.6.50.20140108/gdb/NEWSから

* 新しいレコード ターゲット「record-btrace」が追加されました。新しいターゲット
  ハードウェア サポートを使用して、プロセスの制御フローを記録します。これ
  実行の再生はサポートしていませんが、
  記録された実行ログを調査するための新しいコマンドを以下に示します。
  この新しい記録方法は、次を使用して有効にできます。

btrace を記録する

  「record-btrace」ターゲットは、Intel Atom プロセッサでのみ使用できます
  Linux カーネル 2.6.32 以降が必要です。

* 情報を提供するために記録/再生用に 2 つの新しいコマンドが追加されました
  実行を再生することなく、記録された実行について。
  コマンドは「record btrace」でのみサポートされています。

record instruction-history は実行履歴を出力します
                                命令の粒度

record function-call-history は実行履歴を出力します
                                関数の粒度

私が Atom プロセッサーの所有者をうらやむことはめったにありません ;-)

質問を編集して、回避策または将来のサポート計画の問題に再び焦点を当てます。

于 2014-03-19T15:37:20.027 に答える