Linux 上共享对象 (.so) 的异常

2023-12-29

我有一个名为 ftest 的测试程序。它加载包含测试的 .so 文件并运行在其中找到的测试。其中一项测试加载并运行一个 .so,其中包含用于我们的 O/RM 的 Postgres 数据库驱动程序。

当 Postgres 驱动程序抛出该 .so 文件中定义的异常(或它链接到的异常,但 ftest 未链接到的异常)并被测试框架捕获时,异常析构函数会触发段错误。

每当编译的异常位于已动态加载(使用 dload)的 .so 中时,就会发生此段错误。

这种事情在具有相同架构的 Windows 中工作得很好。我们真的不想限制自己只使用来自核心库的异常——加载项应该可以自由地创建自己的异常类并正常处理它们。

异常是 std::exception 的子类。有时异常可能在库(例如 libpqxx)中定义,这意味着异常有时也超出了我们的控制范围。

使用类似以下的方法抛出异常:

throw exception_class( exception_arguments );

并被发现使用:

catch ( std::exception &e ) {
    // handler code
}

是否需要一些特殊的编译器选项才能使其正常工作?我们是否需要切换为通过以下方式抛出异常throw new exception_class( args )(我们真的不想这样做)?


假设您使用 gcc -

当您构建调用 dlload() 的可执行文件时附加 -Wl,-E。这将从可执行文件中导出所有类型信息符号,这应该允许 RTTI(捕获异常时)正常工作。

VC++ 使用字符串比较来匹配类型信息,导致dynamic_cast 等速度较慢,但​​二进制文件较小。 g++ 使用指针比较。

当我尝试使用在运行时加载的 .so 中实现的纯虚拟接口类时,我遇到了同样的问题。

网上也流传着一些与该主题相关的文章。

希望有帮助, 海曼。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 上共享对象 (.so) 的异常 的相关文章

  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 如何在 Rails 中获取“应用程序跟踪”而不是完整的详细回溯?

    在开发环境的Rails默认错误页面中 您可以查看三个回溯 1 Application Trace 2 Framework Trace和3 Full Trace 但是如何在 Rails 控制器中获取 应用程序跟踪 完整跟踪 exception
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 使用 CSharpCodeProvider 类编译 C# 7.3 的 C# 编译器版本是什么?

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • 如何打开 Perl 的 Windows CMD 窗口并运行命令?

    有没有办法可以打开一个新的cmd窗口并传递一个变量 完成后关闭该窗口 我找到了一些信息 但还不足以让它发挥作用 system start List Perl files dir c dfd dfdf pl B 打开窗口但不运行脚本 主要脚本
  • 我可以使用 --recursive 选项(对于子模块)向 git clone 添加用户名和密码吗?

    我正在使用 git 通过 https 克隆存储库 如下所示 git clone https username password alocation git repo git 这很好 但它也有大量的子存储库可供克隆 所以我使用 recursi
  • 试图理解 lambda

    当我做 dict Alice 7898 Beth 9102 Cecil 3258 print filter lambda x x dict Alice 它显示 7898 当我做下一步的时候 dict Alice 2341 Beth 9102
  • robots.txt URL 格式

    根据这一页 http www robotstxt org robotstxt html User agent 或 Disallow 行中不支持 globbing 和正则表达式 然而 我注意到堆栈溢出机器人 txt https stackov
  • 比较:导入语句与 __import__ 函数

    作为问题的后续使用内置的 import 正常情况下 https stackoverflow com q 46173417 7051394 我进行了一些测试 并得到了令人惊讶的结果 我在这里比较经典的执行时间import声明 并呼吁 impo
  • 检测从父级(开启器)关闭的新选项卡

    我读过很多帖子 但似乎没有一个能准确回答我的问题 是否可以检测由打开的选项卡关闭target blank attr 我需要打开一个新选项卡 窗口 用户将选择一个选项 然后选项卡关闭 当该选项卡关闭时 我需要刷新原始窗口 父窗口或打开窗口 有
  • 根据日期计算数据表中的前几行

    如果这里的一些术语不正确 我深表歉意 我来自 SQL 背景 我才刚刚进入 R 世界 我有一个数据表 其中包含一系列按日期排序的条目 数据表中的字段之一是分组值 一个是时间值 随着数据按组排序 或键入 我是 R 的新手 仍然不确定差异 然后是
  • 如何从 WSL (Ubuntu) Bash 运行 Windows 可执行文件

    随着Windows 10 周年更新2016 年夏天 有机会跑步ubuntu新的二进制文件适用于 Linux 的 Windows 子系统 WSL https blogs msdn microsoft com wsl 2016 04 22 wi
  • 使用 putty 将 EFS 安装到红帽 ec2 实例上时无法解析 EFS 的 DNS 名称

    我遇到一个问题 无法使用 DNS 名称在 red hat ec2 实例上安装 EFS 它抛出错误 mount nfs4 无法解析服务器 us east 1a fs c2aXXXX efs us east 1 amazonaws com 名称
  • 类型错误:无法连接非 NDFrame 对象

    我有这个日期时间索引 dates DatetimeIndex 2017 06 09 2017 06 10 2017 06 11 2017 06 12 2017 06 13 2017 06 14 dtype datetime64 ns fre
  • 如何在 Symfony (Twig) 中包含可重用的小部件?

    所以 我对 Symfony 和 Twig 还很陌生 我想知道如何最好地在模板中包含 创建可重用代码片段 例如 假设您有一个想要在每个页面上显示的侧边栏 extends AppBundle base html twig block body
  • 管理文件java上的大数组

    我正在编写一个需要大量内存的Android应用程序 有时我的双数组达到兆字节的大小 并且我以某种方式需要在可行的时间提供所有可用的数据 我发现大多数时候我无法将它们全部放在 RAM 上 所以我正在寻找一个java API 它可以让我创建在文
  • 动态 Linq 包含多个值

    如何在 Dynamic Linq 中将多个值与 Contain 一起使用 正常 Linq 的预期 using System using System Linq public class Simple public static void M
  • 实体框架错误

    我在实体框架中编写 SQl 查询 var query1 database Database SqlQuery
  • 使用 swift 关闭其他应用程序

    有没有办法快速关闭正在运行的应用程序 例如 如果我创建的应用程序需要关闭 safari 这是用于关闭正在运行的应用程序的 Swift 5 版本不使用 AppleScript AppleScript是一种完美的方式 但不是唯一的方式 本例中以
  • 如何获取特定列的最后一行并使用“appendRow”将数据附加到该行

    我无法找出如何获取其中包含数据的特定列的最后一行 如下所示 确定单列中的最后一行 https stackoverflow com questions 17632165 determining the last row in a single
  • 使用 Stream.BeginRead 进行顺序异步读取

    我正在编写一个类 该类公开流的一部分以供阅读 由于数据可能同时从多个不同的分段读取 因此在任一时间只能有一个操作处于活动状态 我的想法是在每次操作之前锁定底层流 正在锁定周围的流BeginRead调用足以确保从底层流中不同位置的并发异步读取
  • C++ 中的静态可变成员变量?

    为什么或出于什么原因不可能在 C 中将类成员变量声明为static mutable 就像是 static mutable int t This won t compile 对我来说 没有理由禁止这样的声明 例如 出于维护全局类范围统计数据等
  • 使用 selenium C# 在文本字段上执行键盘敲击“Ctrl + A”、“Ctrl + C”和“Ctrl + V”

    How to simply want to input a value in a text box select the complete text from the text box using Ctrl a then copy it u
  • Linux 上共享对象 (.so) 的异常

    我有一个名为 ftest 的测试程序 它加载包含测试的 so 文件并运行在其中找到的测试 其中一项测试加载并运行一个 so 其中包含用于我们的 O RM 的 Postgres 数据库驱动程序 当 Postgres 驱动程序抛出该 so 文件