我正在使用strace调试Qt程序,而open()函数显示:
open("../libPlayCtrl.so", O_RDONLY|O_CLOEXEC)
在它返回3
的情况下似乎有效,但当它返回25
时却没有,并且libPlayCtrl.so
未加载。
区别是什么?我该如何解决?
.so文件是第三方库。不仅是这个,我还使用其他第三个库,他们来自同一个供应商。其他一些lib文件获得了open(...) = 3
,它们似乎工作正常。
修改:
下面的是strace输出的一部分, 由于我改变了配置,.so文件的位置是不同的。并且成功的.so文件是来自供应商的更新版本的lib。
成功案例: 在最终找到.so文件之前总共有15个条款。
open("../lib/tls/i686/sse2/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/i686/sse2/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/i686/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/i686/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/sse2/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/sse2/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/i686/sse2/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/i686/sse2/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/i686/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/i686/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/sse2/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/sse2/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = 3
失败案例:
省略号表示大约有95个open()
子句都等于-1
(未找到)。正如你所看到的那样,它最终找到.so文件后变为30
。
程序显示lib(或其他)的错误:" 无法加载播放器SDK "。
.....
21:02:33 open("./sse2/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
21:02:33 open("./sse2/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
21:02:33 open("./cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
21:02:33 open("./libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
21:02:33 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 30
21:02:33 open("/.../.../.../RemoteClient/lib/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = 30`
答案 0 :(得分:3)
转到open()系统调用的手册页,您会发现open()的返回值是新打开的文件描述符的编号。
在Google投入更多时间之后,您肯定会找到一个解释,即在打开新文件时,内核会将最低的可用未使用文件描述符分配给打开的文件。这就是全部。
总之,open()返回3或25,或17还是8并不重要。它们都表明文件已成功打开,并且您怀疑不同的非零值表示某种问题是不正确的。
您的应用程序当然可能存在某种问题,但它与open()的特定返回值没有任何直接关系。
现在,事实本身有时你会看到open()返回3,有时是25 - 这表明在应用程序执行中有多种方法可以达到这个特定点:没有文件打开,除了标准输入,输出和错误;或者已经打开了至少22个其他文件。完全合理的是,在后一种情况下,您的应用程序执行了更明显的工作,涉及在加载此库之前打开22个或更多文件,并遇到某种问题。但实际问题本身与这个特定的系统调用完全无关。