【问题标题】:How to handle situation of loading wrong shared library version如何处理加载错误共享库版本的情况
【发布时间】:2018-04-20 20:49:39
【问题描述】:

我面临着奇怪的情况。我的引擎应该调用另一个库的某些功能。问题是如果我在系统中有错误(不兼容)的库包版本,引擎将停止工作,没有任何异常或 Linux 信号。基本上,引擎将基本的 Linux 信号处理为分段错误等。这些信号不会出现。我的程序看起来像:

try {
    interface->somefunctioncall(...);
} catch(...) {
    ;
}

interface->somefunctioncall(...) 是从另一个包调用另一个共享库。如果包有错误的版本,这个调用将导致引擎崩溃,Linux 系统中将没有关于它的信息。我只想以某种方式处理这种情况并将一些信息存储到日志中。不管会发生什么。引擎可能会崩溃。但我想在日志中存储引擎崩溃的原因。 另一个很好的提示可能是,如果我可以在运行时处理这种情况并且引擎可以继续。 确保我在嵌入式 Linux 上进行开发,使用第三方软件的可能性有限。 请不要提示:

if (packageversion != expectedversion) {
    do_not_do_call_and_log_the_problem();
} else {
    interface->somefunctioncall(...);
}

非常感谢您的提示。 :-)

【问题讨论】:

  • 为什么不能接受类似于if (packageversion != expectedversion) { 的解决方案? - 似乎是显而易见的解决方案..
  • 确保链接到您需要的库版本,包括主要和次要版本号。 (通常第三个数字,如果有的话,用于不破坏兼容性的错误修复。)您甚至可能需要自己包含一个副本作为应用程序的一部分,但如果它可以从包管理器中获得,您应该只是能够将特定版本列为依赖项。
  • 或者你能静态链接那个库吗?
  • Solution if (packageversion != expectedversion) 对我来说是不可接受的,因为我有 1.000.000 个版本和 1.000.000 个版本的包。项目中的每个人都可以更改任何库中的某些内容,并且无法查看和处理所有这些更改。
  • 我不能静态链接它,因为我不是包的所有者。我对包和项目没有任何控制权。这不是一个好的解决方案。我会遇到很多构建问题。

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


【解决方案1】:

你能看到 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,则“受保护”调用可能处于无限循环中,您可以在记录任何您想要的内容后中止程序。

我应该补充一点,这确实不是一个最佳 解决方案,除非您确实对系统上的软件包版本没有管理控制权。这是对真正应该在其他地方解决的问题的一个解决方案。

这不是最优的一个具体原因是它会产生潜在的竞争条件。这可以通过使警报时间比呼叫应该花费的时间长得多来缓解。然而,为了“修复”其他应该在其他地方修复的问题,这会产生新的潜在问题(并使您的代码复杂化)。

【讨论】:

  • 如果我从错误的包中调用函数接口->somefunctioncall(...) CPU 为 0%,Linux 关闭引擎并且什么都不做。执行 interface->somefunctioncall(...) 后程序不会继续,并且什么也没有。很简单,引擎被杀死但没有信号。
  • 在另一个进程中执行接口调用并检查进程结果可能是一种糟糕的解决方案。但是,这对我来说会很慢。如果我有 DBus 或 COM 或其他东西。我可以 ping 接口,我会检查结果...这些问题处理得很好。不幸的是,我应该直接调用库。
猜你喜欢
  • 2013-07-17
  • 2021-05-23
  • 2012-08-10
  • 2014-09-02
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多