gpt4 book ai didi

c++ - gdb : setting breakpoint when new file is opened or stream instance is created

转载 作者:行者123 更新时间:2023-11-28 01:35:30 24 4
gpt4 key购买 nike

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

最佳答案

This works except it also catches the output to the screen

您可以使用条件断点将输出排除到 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 上将文件名映射到文件描述符。

关于c++ - gdb : setting breakpoint when new file is opened or stream instance is created,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49454236/

24 4 0