gdb:在打开新文件或创建流实例时设置断点

时间:2018-03-23 16:23:36

标签: c++ gdb

我有一个很大的代码,在创建输出文件时并不明显。在创建新的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;
}

2 个答案:

答案 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)

运行它,它应该按预期工作。