chenshuo / muduo

Event-driven network library for multi-threaded Linux server in C++11
https://github.com/chenshuo/muduo
Other
14.64k stars 5.14k forks source link

base/test/logging_test.cc编译后运行遇到了段错误 #669

Closed fangyuan2017 closed 1 year ago

fangyuan2017 commented 1 year ago

经过调试我回溯了错误的函数调用路径 g_logFile.reset(new muduo::LogFile("test_log_st", 50010001000, false)); loggingtest.cc 的main里的代码 创建了logFile对象 rollFile(); logFile的构造函数里调用了rollFile file.reset(new FileUtil::AppendFile(filename)); rollFile函数里创建了AppendFile对象

具体的错误就在创建AppendFile对象时fopen没有创建文件成功,fp_指针为空,但是令我感到不可思议的是fp_通过了断言,所以我一开始没有注意到fp_是一个空指针,但是我注意到了fopen如果执行成功理应创建一个.log的文件,实际上我并没有找到该文件,所以我怀疑是fopen没有创建文件成功,因此我用了sudo权限运行编译后的文件,就没有报错了。

fp_(::fopen(filename.cstr(), "ae")) ; assert(fp); ::setbuffer(fp, buffer, sizeof buffer_);

但是让我无法理解的是 这个fp明明就是一个空指针! 我用if(fp == nullptr)进行判断时,它能成功判断它为空指针,但是用assert判断时它却通过了断言(这也是一开始我觉得fp_不是空指针的原因,因为它通过了断言) 这是我不能理解的地方,原谅我的C++水平不是很高,不知道您是否能给出一些看法?

总之该问题的出现原因我总结如下:编译后的文件运行时没有权限用fopen创建一个文件,当用sudo执行它时就可以用fopen创建一个文件了,其次assert(fp_)在创建文件失败的情况下依然会通过断言。

chenshuo commented 1 year ago

如果是 Release build,那么 assert() 不会起作用。