【问题标题】:Segmentation fault when accessing a function I previously could access to [closed]访问我以前可以访问的功能时出现分段错误[关闭]
【发布时间】: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


【解决方案1】:
WriteLog("[RouteInfoManager::UpdateRouteStatus] IsAsva %d", audioInfoProvider->IsAsvaAuthorisedInTrainCA());

假设WriteLogprintf 一样工作(或转发到printf),您的格式说明符与参数不匹配。

%d 用于int,而不是bool

您的程序有未定义的行为。

坚持投到int

【讨论】:

  • 虽然这绝对是您的程序中的一个错误,但实际上猜测是它导致了段错误,因为您没有提供minimal reproducible example(或者调试器的更多输出)。例如,audioInfoProvider 可以是 nullptr。使用调试器进一步调查崩溃。
  • 虽然 %d 不适合 bool,但它可以工作。重点是我写的那些WriteLogs是看函数的返回值,但是不管写不写WriteLogs都会出错
  • @marpe 它没有“工作”它有未定义的行为。
  • @marpe “无论我是否写WriteLogs都会出现错误” 那为什么你的minimal reproducible example中有WriteLogs呢?