我面临着奇怪的情况。我的引擎应该调用另一个库的某些函数。问题是如果我在系统中有错误(不兼容)的库包版本,引擎将停止工作,没有任何异常或 Linux 信号。基本上,引擎正在处理基本的 Linux 信号,如段错误等。这些信号不会出现。我的程序看起来像:
try {
interface->somefunctioncall(...);
} catch(...) {
;
}
interface->somefunctioncall(...) 是从另一个包调用另一个共享库。如果包有错误的版本,这个调用将导致引擎崩溃,Linux 系统中将没有关于它的信息。我只想以某种方式处理这种情况并将一些信息存储到日志中。不管会发生什么。引擎可能会崩溃。但我想将信息存储在日志中,了解引擎崩溃的原因。 另一个很好的提示可能是,如果我可以在运行时处理这种情况并且引擎可以继续。 确保我在嵌入式 Linux 上进行开发,使用第三方软件的可能性有限。 请不要提示:
if (packageversion != expectedversion) {
do_not_do_call_and_log_the_problem();
} else {
interface->somefunctioncall(...);
}
非常感谢您的提示。 :-)
最佳答案
你能看到 CPU 在做什么吗?如果它固定在 100%,则可能意味着您处于无限循环中,这可以解释没有崩溃的原因。 如果它是一个无限循环,您可以做的一件事是在调用电话之前设置一个闹钟,然后再取消它。
alarm( 5 ); // 5 seconds, make it long enough to be certain that somefunctioncall should have returned
interface->somefunctioncall(...);
alarm( 0 ); // to cancel the alarm
然后无论您在代码中处理信号的什么地方,都处理 SIGALRM
信号。如果您收到 SIGALRM
,则“ protected ”调用可能处于无限循环中,您可以在记录任何您想要的内容后中止该程序。
我应该补充一点,这确实不是一个最佳 解决方案,除非您真的无法对系统上的包版本进行管理控制。这是一个真正应该在别处解决的问题的解决方案。
这不是最优的一个具体原因是它会产生潜在的竞争条件。这可以通过使警报时间比调用应该花费的时间长得多来缓解。然而,为了“修复”其他应该在其他地方修复的问题,这会产生新的潜在问题(并使您的代码复杂化)。
关于c++ - 如何处理加载错误共享库版本的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49949532/