这个软件运行良好已经超过一年了,我大约6个月前停止更新它。在这期间,我的开发环境被多次更新。
现在我再次编译它时发现了一个意外的错误。
普通版本的软件仍然按预期工作,但静态链接的版本会出现段错误。
我假设错误在于OSmesa配置/编译/链接过程中我的问题而不是库代码中的问题,但任何关于更好地调试段错误的建议都将不胜感激。
尝试了许多编译过程的变化,但没有成功,我现在相当困惑。 有人能看到我在下面描述的步骤中做了什么愚蠢的事情吗?
我使用相同版本的共享库重新编译了OSmesa库的静态版本(12.0.6),禁用了所有不需要的功能(使用基于Ubuntu的系统,存储库中没有OSmesa的静态版本):
./configure \ --disable-xvmc \ --disable-glx \ --disable-dri \ --with-dri-drivers="" \ --with-gallium-drivers="" \ --disable-shared-glapi \ --disable-egl \ --with-egl-platforms="" \ --enable-osmesa \ --enable-gallium-llvm=no \ --disable-gles1 \ --disable-gles2 \ --enable-static \ --disable-shared
这是我离屏渲染工具的编译命令:
g++ -std=c++11 -Wall -O3 -g -static -static-libgcc -static-libstdc++ ./src/measure_model.cpp model.o thumbnail.o -o measure_model_debug -pthread -lOSMesa -ldl -lm -lpng -lz -lcrypto
这是我静态编译使用OSmesa时得到的警告,即使一年前使用的可用的静态二进制文件也有这个警告:
/home/XXX/XXX/backend/lambda/mesa/mesa-12.0.6/src/mesa/main/dlopen.h:52: warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
这是运行工具时得到的结果:
Segmentation fault (core dumped)
但是,如果我简单地跳过OSmesa上下文创建步骤(显然也跳过了所有的3D渲染),就不会产生段错误。
这是回溯信息:
#0 0x0000000000000000 在 ?? () #1 0x00000000004af20a 中的mtx_init (type=4, mtx=0xe10f70)位于../../include/c11/threads_posix.h:215处 #2 在main/hash.c中的_mesa_NewHashTable ()位于第135行 #3 _mesa_alloc_shared_state (ctx=ctx@entry=0xdcc9b0) 在main/shared.c中位于第67行 #4 在main/context.c中的_mesa_initialize_context (ctx=ctx@entry=0xdcc9b0, api=api@entry=API_OPENGL_COMPAT, visual=, share_list=share_list@entry=0x0, driverFunctions=driverFunctions@entry=0x7fffffffcd40)位于第1192行 #5 在osmesa.c中的OSMesaCreateContextAttribs (attribList=attribList@entry=0x7fffffffd290, sharelist=)位于第834行 #6 在osmesa.c中的OSMesaCreateContextExt (format=, depthBits=, stencilBits=, accumBits=, sharelist=)位于第660行 #7 在generate_thumbnail(Model*,Json::Value)中的generate_thumbnail()位于第46,8742行 #8 在./src/measure_model.cpp中的main (argc=,argv=)位于第107行必须使用静态链接的二进制文件。
该段错误发生在我编译工具的同一台机器上(OSmesa静态库也是在同一台机器上编译的),但是在相同工具的非静态链接版本中没有段错误。
bt
,info reg
,frame 1; disassemble
。mtx_init
使用了一些pthread 互斥锁/互斥锁属性函数,您在静态程序中使用pthread时遇到了一些问题。这可能是个坏主意,请尝试更改您的要求严格程度(动态链接到glibc和pthread,对于在旧操作系统上运行,使用自己的glibc+pthreads副本和rpath链接到它们)。 - osgx-Wl,--whole-archive -lpthread -Wl,--no-whole-archive
而不是-pthread
**”。 - osgx