我的程序打印了几个随机数字和字符。它将来自我留下的一些调试代码。它可能是在我最近更改的一些东西中间接打开的。即使在快速浏览了我的库之后,我也不知道它是从哪里来的。
如何轻松追踪打印调用的来源?
(它将是printf
或cout <<
之一)
我假设这与gdb
类似,每次写入标准输出时都会产生堆栈跟踪。从现在开始,我肯定会采取一种预防性的方法,但只对可能的解决方案感兴趣。
发布于 2013-10-02 08:55:31
宏可以帮助你。在宏定义中,您可以使用__FILE__
和__LINE__
(以及其他类似的宏)来打印位置信息。
下面是一个示例:
#include <iostream>
#define mycout std::cout << __FILE__ << "(" << __LINE__ << ") "
#define cout mycout
int main()
{
cout << "Hello";
}
它打印文件名和行号,然后显示您的消息(本例中为"Hello"
)。
main.cpp(8) Hello
发布于 2013-10-02 09:06:44
如果除了您正在寻找的控制台输出之外,没有太多其他控制台输出,那么现在就是使用调试器的时候了。首先,使用cout
和printf
语句编写一个小示例程序。调试到调用中以查看它们的实现,并在那里放置一个断点。对于printf,您可能必须在汇编程序中执行此操作。
一旦有了这些断点,就在调试器中运行程序并等待,直到命中断点-调用堆栈应该告诉您对printf
/cout
的调用在哪里。
发布于 2013-10-02 09:54:47
看起来可以完成这项工作。特别是能够使用-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]
https://stackoverflow.com/questions/19133221
复制相似问题