快速跟踪/查找对 printf 或 cout 的调用(丢失已久的调试输出)
Quick way to trace/find a call to printf or cout (long lost debug output)
我的程序正在打印几个随机数字和字符。它将来自我留下的一些调试代码。它可能在我最近更改的内容中被间接打开了。我不知道它来自哪里,即使在我的图书馆中快速浏览了一些之后。
如何轻松追踪打印呼叫的来源?
(这将是printf
或cout <<
之一)
我假设类似于gdb
每次写入 stdout 时都会吐出堆栈跟踪。从现在开始,我肯定会采取预防措施,但只是感兴趣的可能的解决方案。
如果除了要查找的控制台输出之外没有许多其他控制台输出,那么现在是时候使用调试器了。首先,使用 cout
和 printf
语句编写一个小示例程序。调试到调用以查看其实现,并在那里放置一个制动点。对于 printf,您可能必须在汇编程序中执行此操作。
获得这些断点后,在调试器中运行程序并等待断点命中 - 调用堆栈应告诉您对printf
/cout
的调用在哪里。
可以帮到你。在宏定义中,您可以使用__FILE__
和__LINE__
(以及其他此类宏)来打印位置信息。
下面是一个示例:
#include <iostream>
#define mycout std::cout << __FILE__ << "(" << __LINE__ << ") "
#define cout mycout
int main()
{
cout << "Hello";
}
它打印文件名和行号,后跟您的消息(在本例中为"Hello"
)。
main.cpp(8) Hello
在线演示
strace-plus看起来可以完成这项工作。特别是能够仅使用-e trace=...
选项跟踪某些系统调用以消除混乱。您也可以... 2>&1 | grep -C 20 ...
找到确切的打印调用。
这是该工具的给定示例输出:
write(1, "bar againn", 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]
@ArneMertz好主意,谢谢!.在我的情况下,使用调试器效果很好,因为在麻烦的打印之前我没有太多的输出。我只需要弄清楚如何在printf
或cout
呼叫上设置断点。这个页面给了我答案。
主函数添加单个printf
和/或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
循环。
- C++ 17 |调试输出
- 在集成终端上运行vscode lldb调试器时,如何获取程序的输出?
- 不同的输出调试与发布
- Opengl 4 调试输出不起作用
- 调试解决方案,对某些操作的每个输出进行 #if
- VSCode C++调试捕获控制台输出
- 如何调试输出指向成员的指针
- 调试器看到的输出线程 ID
- 带有调试输出的X3解析器segfaults(boost_spirit_x3_debug)
- basic_string::替换的超出范围异常,而在范围内,正如调试相同参数的输出所证明的那样
- VS Code C++程序在调试时不显示任何输出
- 荒谬的输出.给出不同的输出,并带有调试.需要专家干预
- Delphi 2007 EXE和C++DLL:调试输出:027D4FF8处的堆块在027D5009处修改,超过了请求的9
- 是否可以在编译时输出 constexpr 变量来调试模板元程序
- C++调试 - 从文件中读取并输出 2D 数组
- 阵列调试不正确的输出,复杂算法
- Gstreamer 调试插件的多个文件的输出
- c++GetSystemTime在调试时返回0,但在遍历断点时返回正确的输出
- XCode调试器lldb中断,没有错误输出,但程序运行良好
- Xcode调试器未显示C++cout输出