我有一个很大的代码,在创建输出文件时并不明显。在创建新的ofstream
时,gdb中是否有一种方法可以设置断点?或者当文件被写入?
我尝试过像
这样的事情(gdb) b ofstream
Function "ofstream" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n
(gdb) b std::ofstream
Function "std::ofstream" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n
我想这样做,以便我可以获得一个回溯来找出哪些函数正在创建这个文件。
我也试过
(gdb) catch syscall write
除非它还将输出捕获到屏幕(并且stdout
的输出是详细的),但实际上我想将输出捕获到文件中,这是有效的。
编辑:这是一个最小的工作示例。
#include <iostream>
#include <fstream>
using namespace std;
int main () {
cout << "hello world\n" ;
ofstream myfile;
myfile.open ("example.txt");
myfile << "Writing this to a file.\n";
myfile.close();
return 0;
}
答案 0 :(得分:2)
除了它还可以将输出捕获到屏幕
之外
您可以使用条件断点将输出排除到stdout
。在x86_64上,可以将rdi
寄存器与1
进行比较:
(gdb) catch syscall write
Catchpoint 1 (syscall 'write' [1])
(gdb) condition 1 $rdi!=1
(gdb) i b
Num Type Disp Enb Address What
1 catchpoint keep y syscall "write"
stop only if $rdi!=1
(gdb)
您还可以在所需的确切文件描述符上设置条件断点。请参阅https://stackoverflow.com/a/8052681/72178如何将文件名映射到Linux上的文件描述符。
答案 1 :(得分:0)
不幸的是,你必须提供完整的功能原型。但是gdb可以为您提供可用方法和功能的列表。如果您输入(注意单引号)
(gdb) break 'std::
您可以使用制表符调用自动完成功能。这将返回命名空间std下所有gdb已知方法和函数的列表。在您的情况下(ofstream),您将在列表中找到以下条目:
std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(char const*, std::_Ios_Openmode)```
现在只需使用以下命令设置断点:
(gdb) break std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(char const*, std::_Ios_Openmode)
运行它,它应该按预期工作。