首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >快速跟踪/查找对printf或cout的调用(丢失已久的调试输出)

快速跟踪/查找对printf或cout的调用(丢失已久的调试输出)
EN

Stack Overflow用户
提问于 2013-10-02 16:51:32
回答 4查看 1.5K关注 0票数 0

我的程序打印了几个随机数字和字符。它将来自我留下的一些调试代码。它可能是在我最近更改的一些东西中间接打开的。即使在快速浏览了我的库之后,我也不知道它是从哪里来的。

如何轻松追踪打印调用的来源?

(它将是printfcout <<之一)

我假设这与gdb类似,每次写入标准输出时都会产生堆栈跟踪。从现在开始,我肯定会采取一种预防性的方法,但只对可能的解决方案感兴趣。

EN

回答 4

Stack Overflow用户

发布于 2013-10-02 16:55:31

宏可以帮助你。在宏定义中,您可以使用__FILE____LINE__ (以及其他类似的宏)来打印位置信息。

下面是一个示例:

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>

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

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

它打印文件名和行号,然后显示您的消息(本例中为"Hello")。

代码语言:javascript
代码运行次数:0
运行
复制
main.cpp(8) Hello

Online Demo

票数 2
EN

Stack Overflow用户

发布于 2013-10-02 17:06:44

如果除了您正在寻找的控制台输出之外,没有太多其他控制台输出,那么现在就是使用调试器的时候了。首先,使用coutprintf语句编写一个小示例程序。调试到调用中以查看它们的实现,并在那里放置一个断点。对于printf,您可能必须在汇编程序中执行此操作。

一旦有了这些断点,就在调试器中运行程序并等待,直到命中断点-调用堆栈应该告诉您对printf/cout的调用在哪里。

票数 2
EN

Stack Overflow用户

发布于 2013-10-02 17:54:47

看起来可以完成这项工作。特别是能够使用-e trace=...选项仅跟踪特定的系统调用,以消除混乱。您还可以通过... 2>&1 | grep -C 20 ...找到确切的打印调用。

这是该工具的给定示例输出:

代码语言:javascript
代码运行次数:0
运行
复制
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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19133221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档