我有一个由用 C++ 编写的不同模块组成的应用程序。
其中一个模块用于处理 SunGrid 引擎上的分布式任务。它使用 DRMAA API
提交和监控网格作业。如果客户端不支持网格,则应使用本地机器
API libdrmaa.so 的共享对象在编译时链接并在运行时加载。
如果使用我的应用程序的客户端有这个“.so”,一切都很好,但如果客户端没有,
应用程序退出未能加载共享库。
为避免这种情况,我已将 API 调用替换为使用 dlsym() 和 dlopen() 获得的函数指针。
现在,如果对 dlopen 的调用没有成功并且我的目标实现了,我可以使用本地机器而不是网格。
现在的问题是,应用程序现在可以成功运行小型测试用例,但对于较大的测试用例,它会抛出段错误,而使用动态加载的相同代码可以正常工作。
我在使用 dlsym() 和 dlopen() 时是否遗漏了什么?
有没有其他方法可以达到同样的目的?
如有任何帮助,我们将不胜感激。
谢谢,
最佳答案
这不太可能是通过 dlsym()
加载的代码的直接问题 - 在动态加载导致段错误的意义上。
它可能正在做的是暴露一个单独的问题,可能是通过四处移动东西。这可能意味着一个杂散的(未初始化的)指针在静态链接情况下指向“合法”某处,但在动态链接情况下指向其他地方 - 而其他地方会触发段错误。事实上,从长远来看,这对您是有好处的 - 它表明存在一个问题,否则可能会长时间未被发现。
我认为这特别有可能,因为您提到它发生在较大的测试中而不是小的测试中。
关于c++ - 使用 C 动态加载例程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1079808/