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
Uh oh!
There was an error while loading. Please reload this page.
-
经过调试我回溯了错误的函数调用路径
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