base/test/logging_test.cc编译后运行遇到了段错误 #670
fangyuan2017
started this conversation in
General
Replies: 1 comment
-
如果是 Release build,那么 assert() 不会起作用。 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
经过调试我回溯了错误的函数调用路径
g_logFile.reset(new muduo::LogFile("test_log_st", 50010001000, false)); logging_test.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.c_str(), "ae")) ;
assert(fp_);
::setbuffer(fp_, buffer_, sizeof buffer_);
但是让我无法理解的是 这个fp_明明就是一个空指针! 我用if(fp_ == nullptr)进行判断时,它能成功判断它为空指针,但是用assert判断时它却通过了断言(这也是一开始我觉得fp_不是空指针的原因,因为它通过了断言) 这是我不能理解的地方,原谅我的C++水平不是很高,不知道您是否能给出一些看法?
总之该问题的出现原因我总结如下:编译后的文件运行时没有权限用fopen创建一个文件,当用sudo执行它时就可以用fopen创建一个文件了,其次assert(fp_)在创建文件失败的情况下依然会通过断言。
Beta Was this translation helpful? Give feedback.
All reactions