0

私のプログラムは、いくつかの乱数と文字を出力しています。それは、私がぶらぶらしているデバッグコードからのものです。最近変更したときに間接的にオンになっている可能性があります。ライブラリをすばやくgrepした後でも、どこから来たのかわかりません。

print 呼び出しのソースを簡単に追跡するにはどうすればよいですか?
(printfまたは のいずれかになりますcout <<)

gdbstdout への書き込みごとにスタック トレースを吐き出すのと似たようなことを想定しています。私は間違いなくこれから予防的アプローチをとりますが、可能な解決策に興味があります.

4

4 に答える 4

2

マクロが役に立ちます。マクロ定義では、__FILE__and __LINE__(およびその他のそのようなマクロ) を使用して位置情報を出力できます。

次に例を示します。

#include <iostream>

#define mycout std::cout <<  __FILE__  << "(" << __LINE__ << ") "
#define cout mycout

int main()
{
    cout << "Hello";
}

ファイル名と行番号の後にメッセージが表示されます ("Hello"この場合)。

main.cpp(8) Hello

オンラインデモ

于 2013-10-02T08:55:30.800 に答える
1

strace-plusは、それが仕事をするように見えます。-e trace=...特に、クラッタを削除するオプションを使用して、特定のシステム コールのみをトレースでき... 2>&1 | grep -C 20 ... 正確な印刷呼び出しを見つけることもでき

これは、ツールの出力例です。

write(1, "bar again\n", 10)             = 10
  > write() ../sysdeps/unix/syscall-template.S:82
  > _IO_new_file_write() fileops.c:1277
  > _IO_new_do_write() fileops.c:531
  > _IO_new_file_overflow() fileops.c:889
  > _IO_puts() ioputs.c:40
  > bar() [/home/pgbovine/strace-plus/hello]
  > foo() [/home/pgbovine/strace-plus/hello]
  > main() [/home/pgbovine/strace-plus/hello]
  > __libc_start_main() libc-start.c:258
  > _start() [/home/pgbovine/strace-plus/hello]
于 2013-10-02T09:54:47.017 に答える
0

@ArneMertz良いアイデア、ありがとう!. 私の場合、面倒な印刷の前に出力があまりないので、デバッガーを使用するとうまくいきます。printforcout呼び出しにブレークポイントを設定する方法を見つけなければなりませんでした。このページに答えがありました。

printfメイン関数に 1 つのand/or呼び出しを追加し、coutデバッグ情報を使用してコンパイルします。

gdb program
br main
r
disas

このようなものを与えます:

Dump of assembler code for function main():
   0x00000000004cdb66 <+0>:     push   %rbp
   0x00000000004cdb67 <+1>:     mov    %rsp,%rbp
   0x00000000004cdb6a <+4>:     push   %r12
   0x00000000004cdb6c <+6>:     push   %rbx
   0x00000000004cdb6d <+7>:     sub    $0x380,%rsp
=> 0x00000000004cdb74 <+14>:    mov    $0x5ae287,%edi
   0x00000000004cdb79 <+19>:    callq  0x4c1cf0 <puts@plt>
...

0x4c1cf0この場合の住所はどこですかprintf

b *0x4c1cf0
c
...
bt

そして、スタック トレースを使用して次の printf の呼び出しに到達します。

c一定の/alt-tab/btサイクルなしで、これを自動化する良い方法があればよいのですが。

于 2013-10-02T09:39:09.993 に答える