c++ - 如何处理加载错误共享库版本的情况

标签 c++ linux shared-libraries embedded-linux

我面临着奇怪的情况。我的引擎应该调用另一个库的某些函数。问题是如果我在系统中有错误(不兼容)的库包版本,引擎将停止工作,没有任何异常或 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/

相关文章:

C++,复制构造函数声明/定义

c++ - 将异步与 std::accumulate 一起使用

c++ - 通过 Internet 发送 boolean 值(Windows 和 Linux)

linux - 如何在大型代码库中运行 ctags?

c - 将 R CMD SHLIB 与 OpenMP 一起使用不用于包构建

c++ - 是否可以将 Debug模式编译的库链接到 Release模式的项目?

c++ - C中的内存分配过程?是自上而下还是自下而上的方法

linux - awk 的默认字段分隔符

c++ - Netbeans : error while loading shared libraries: libicuuc. so.50:无法打开共享对象文件:没有这样的文件或目录

linux -/dev/tcp 在 LINUX 中不存在