【发布时间】:2026-01-06 17:30:01
【问题描述】:
我正在尝试访问一个函数来检查一个条件,但是虽然起初我可以访问它,但经过几次迭代后,我遇到了分段错误。我已经包含了一些 WriteLogs 来查看函数的返回值是什么。
这是我能够访问该功能的四次之一:
[Fri Jan 10 12:40:25:889]: [INFO][RouteInfoManager::UpdateRouteStatus] Driving Mode 2 passengers 0
[Fri Jan 10 12:40:25:889]: [INFO][RouteInfoManager::UpdateRouteStatus] IsAsva 1
[Fri Jan 10 12:40:26:060]: [INFO][DatasetParam::Int] DatasetParam_TypeException, setting speaker_gain
[Fri Jan 10 12:40:26:063]: [INFO][DatasetParam::Int] DatasetParam_TypeException, setting speaker_gain
[Fri Jan 10 12:40:26:175]: [INFO][DatasetParam::Str] DatasetParam_TypeException, setting cpu_version
还有这个,分段错误错误:
[Fri Jan 10 12:40:26:901]: [INFO][RouteInfoManager::UpdateRouteStatus] Driving Mode 2 passengers 0
[Thread 0xaa3ebb40 (LWP 27594) exited]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xa0f49b40 (LWP 27661)]
0x086d0273 in AlstomMP14::RouteInfoManager::UpdateRouteStatus (this=0x90889e8) at ../src/route/RouteInfoManager.cpp:283
283 WriteLog("[RouteInfoManager::UpdateRouteStatus] IsAsva %d", audioInfoProvider->IsAsvaAuthorisedInTrainCA());
这些是 WriteLogs:
WriteLog("[RouteInfoManager::UpdateRouteStatus] Driving Mode %d passengers %d", trainDataProvider->GetDrivingMode(), trainDataProvider->GetDrivingMode() != DRIVING_MODE_AUTOMATIC
|| trainDataProvider->IsTrainWithoutPassengers());
WriteLog("[RouteInfoManager::UpdateRouteStatus] IsAsva %d", audioInfoProvider->IsAsvaAuthorisedInTrainCA());
以及这些涉及的功能:
bool AudioManager::IsAsvaAuthorisedInTrainCA() {
/// 1) Return true if train CA is without passengers and driving mode is automatic.
return (!IsTrainCAWithoutPassengers() && trainDataProvider->GetDrivingMode() == DRIVING_MODE_AUTOMATIC);
}
bool AudioManager::IsTrainCAWithoutPassengers() {
/// 1) Return true if driving mode is not automatic and train is without passengers.
return (trainDataProvider->GetDrivingMode() != DRIVING_MODE_AUTOMATIC
|| trainDataProvider->IsTrainWithoutPassengers());
}
如您所见,WriteLogs 显示 IsTrainCAWithoutPassengers() 函数的返回,这是 IsAsvaAuthorisedInTrainCA() 函数的条件之一。
我不明白为什么,尽管每次都具有相同的值(2 和 0),但有时我可以访问 IsAsvaAuthorisedInTrainCA(),但有时我会遇到分段错误。
【问题讨论】:
-
这就是最佳实践建议针对预期和意外输入进行广泛单元测试的原因。和同行评审以追逐可能的未定义行为调用代码。如果它有时有效,有时无效,则可能是在您的程序中某处调用了 UB...
-
283是哪一行?
-
@stark this WriteLog WriteLog("[RouteInfoManager::UpdateRouteStatus] IsAsva %d", audioInfoProvider->IsAsvaAuthorisedInTrainCA());调用 IsAsvaAuthorisedInTrainCA() 函数
-
该行不在您提供的代码中
-
它是否被其他值覆盖?您可以尝试在指针工作和不工作时打印指针的值,看看它是否改变。
标签: c++ multithreading function segmentation-fault