C++Builder中使用rdbuf重定向cerr的异常问题排查
C++Builder中cerr重定向的内存访问违规问题
我尝试在程序启动时将cerr重定向到文件,程序结束时恢复其默认输出,该思路参考了Stack Overflow的已采纳方案。但在C++Builder环境中遇到异常情况:
- 注释第一行的
#define MAKE_WORK会触发内存访问违规; - 开启该宏后程序运行期间正常,但在更大的程序中,应用终止后仍可能出现相同的内存访问违规问题。
测试代码如下:
//#define MAKE_WORK #include <vcl.h> #pragma hdrstop #include <fstream> #include "TestRdbuf.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; std::streambuf* origBuff; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { std::ofstream oFile("ErrorLog.txt"); origBuff = std::cerr.rdbuf(); std::cerr.rdbuf(oFile.rdbuf()); std::cerr << "Started: " << Now() << std::endl; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { #ifdef MAKE_WORK std::ofstream oFile("ErrorLog.txt", std::ios_base::app); std::cerr.rdbuf(oFile.rdbuf()); #endif std::cerr << "Closing:" << Now() << std::endl; std::cerr.rdbuf(origBuff); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { #ifdef MAKE_WORK std::ofstream oFile("ErrorLog.txt", std::ios_base::app); std::cerr.rdbuf(oFile.rdbuf()); #endif std::cerr << "Debug log time: " << Now() << std::endl; } //--------------------------------------------------------------------------- void __fastcall TForm1::btnShowFileClick(TObject *Sender) { TMemo * Memo = new TMemo(pnlBody); Memo->Parent = pnlBody; Memo->Align = TAlign::alClient; Memo->Font->Size = 12; Memo->Lines->LoadFromFile("ErrorLog.txt"); Memo->ReadOnly = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { #ifdef MAKE_WORK std::ofstream oFile("ErrorLog.txt", std::ios_base::app); std::cerr.rdbuf(oFile.rdbuf()); #endif std::cerr << "Exit clicked: " << Now() << std::endl; Application->Terminate(); } //---------------------------------------------------------------------------
内容的提问来源于stack exchange,提问作者Vic Fanberg
相关产品推荐
相关产品推荐

