c++ - 使用 C 动态加载例程的问题

标签 c++ shared-libraries sungridengine dlsym drmaa

我有一个由用 C++ 编写的不同模块组成的应用程序。
其中一个模块用于处理 SunGrid 引擎上的分布式任务。它使用 DRMAA API 提交和监控网格作业。如果客户端不支持网格,则应使用本地机器

API libdrmaa.so 的共享对象在编译时链接并在运行时加载。
如果使用我的应用程序的客户端有这个“.so”,一切都很好,但如果客户端没有, 应用程序退出未能加载共享库。
为避免这种情况,我已将 API 调用替换为使用 dlsym() 和 dlopen() 获得的函数指针。 现在,如果对 dlopen 的调用没有成功并且我的目标实现了,我可以使用本地机器而不是网格。
现在的问题是,应用程序现在可以成功运行小型测试用例,但对于较大的测试用例,它会抛出段错误,而使用动态加载的相同代码可以正常工作。

我在使用 dlsym() 和 dlopen() 时是否遗漏了什么?
有没有其他方法可以达到同样的目的?

如有任何帮助,我们将不胜感激。

谢谢,

最佳答案

这不太可能是通过 dlsym() 加载的代码的直接问题 - 在动态加载导致段错误的意义上。

它可能正在做的是暴露一个单独的问题,可能是通过四处移动东西。这可能意味着一个杂散的(未初始化的)指针在静态链接情况下指向“合法”某处,但在动态链接情况下指向其他地方 - 而其他地方会触发段错误。事实上,从长远来看,这对您是有好处的 - 它表明存在一个问题,否则可能会长时间未被发现。

我认为这特别有可能,因为您提到它发生在较大的测试中而不是小的测试中。

关于c++ - 使用 C 动态加载例程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1079808/

相关文章:

c++ - 调试断言失败!表达式 : _BLOCK_TYPE_IS_VALID

c++ - 检查路径是否有效,即使它不存在

linux - ELF 可执行文件 : required version information for imported symbols

android - 如何为 Android 和 IOS 构建一个库?

amazon-web-services - 如何测量在 Sun Grid Engine 中完成一批作业所需的时间?

sungridengine - 确保 Star Cluster/SunGridEngine (AGE) 上的每个节点一个作业

c++ - crypto++ 因文件中的字符串而失败?

c++ - 便携性是汽车的一个问题吗?

linux - 加载现有库失败

cluster-computing - 如何获得 SGE 工作状态