代码之家  ›  专栏  ›  技术社区  ›  ovanes

中断C函数执行并返回C++调用方

  •  0
  • ovanes  · 技术社区  · 14 年前

    我已经编写了一个工具(在C++中),它加载一个共享的库(用C编写)。这个库有一个错误,我无法影响修复。问题是它读取一些输入并写入解码的输出。有时如果输入错误,这个库不做任何检查就开始解码以下内存区域。这会导致segfault。

    最初,我的想法是将输入放入分页内存(linuxmap syscall)并保护(mprotect)最后一页,防止访问。通过安装自己的SigSeSv处理程序,我的C++应用程序可以抛出一个异常(当用GCC标志-FNON调用异常编译)。此异常将中断C库的读取。我知道这个库不分配任何内存(或其他资源),这可能会在堆栈展开期间丢失。整个场景在我的单元测试中运行良好,所有的测试都是一个单一的C++应用程序。但现在当lib中的C代码被调用时,我的应用程序就终止了。。。我是否也需要重建这个C-SO with-fnon调用异常标志?我不能编译这个库,但只能重新链接它,因为我只能访问obj文件。

    +------------C++ APP----------+
    |                             |
    | Install SIGSEGV handler     |
    | code calling C SO functions |
    |                             |
    |   +----------C SO Functions------------+
    |   |   execute producing SIGSEGV        |
    |   +------------------------------------+
    |                             |
    | SIGSEGV Handler called      |
    |   => throw Exception        |
    |      to stop execution of   |
    |      C function             |
    +-----------------------------+
    

    欢迎提出其他建议。

    非常感谢,

    卵形


    我不认为在这里工作的重点是围绕一个SIGSEGV。首先,库读取数据并将其写入我之前传递的文件句柄。我可以配置如何写入该句柄(是否缓冲)。此外,我清楚地知道它不分配任何堆数据或资源。最后,它试图访问我的应用程序保护的内存,以避免此类错误。从用户的角度来看,我不能告诉其他人:很抱歉,二进制跟踪只是半可解码的,因为有些数据不一致。我知道这些数据是不稳定的,我完全知道如何处理这种不一致。所以我可以优雅地恢复。我想我会尝试使用sigsetjmp/siglongjmp POSIX函数,并希望它们作为异常会做得更好。实际上,setjmp/longjmp或sigsetjmp/siglongjmp都用于实现异常。

    是的,我调试了我的应用程序,并查看调用堆栈是否有效。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Lars    14 年前

    不幸的是,我没有如前所述的问题的答案-你是否试过在调试器下运行你的应用程序,看看它到底在哪里终止?

    然而,我想到的另一种方法是将错误库的使用放在一个单独的程序中,从你的应用程序启动它,并通过管道将数据传递给它。

        2
  •  0
  •   BЈовић    14 年前

    这可能是个愚蠢的问题,但必须检查核心文件吗?或者在调试器中运行应用程序?

        3
  •  0
  •   ovanes    14 年前

    好的伙计们,

    谢谢你的建议。

    谨致问候,