Linux下Clang编译sample_test_webrtc时Mutex失败问题排查
WebRTC静态链接示例运行时互斥锁断言失败问题
WebRTC仓库包含内部示例应用sample_test_webrtc,使用GN+Ninja构建后可正常运行。将该示例代码单独取出,与自行编译的libwebrtc.a静态链接后,运行触发断言错误。
构建libwebrtc.a的GN命令
./buildtools/linux64/gn gen out/Default --target_cpu=x64 --target_os="linux" --host_os="linux" --host_cpu="x64" --args="is_debug=false rtc_include_tests=false libyuv_include_tests=false rtc_build_examples=false is_component_build=false use_rtti=true use_custom_libcxx=false rtc_enable_protobuf=false clang_use_chrome_plugins=false rtc_ios_macos_use_opengl_rendering=false rtc_libvpx_build_vp9=false archive_seed_corpus=false toolkit_views=false enable_iterator_debugging=false enable_libaom=false rtc_build_tools=false" --complete_static_lib
自行编译示例的Makefile
CC = clang++ CFLAGS = -Wall -g -DWEBRTC_POSIX -std=c++17 -stdlib=libstdc++ SRC_DIR = $(PWD) SRC_FILES = $(wildcard $(SRC_DIR)/*.cpp) $(wildcard $(SRC_DIR)/*/*.cpp) OBJ_DIR = $(PWD)/Obj OBJ_FILES = $(patsubst $(SRC_DIR)/%.cpp, $(OBJ_DIR)/%.o, $(SRC_FILES)) ADDITIONAL_OBJ_FILES = $(PWD)/Deps/*.o INCLUDES_PATH = -I. -I/home/stefan/webrtc-l4s/webrtc_native/m104/src -I../../third_party/webrtc/buildtools/third_party -I../../third_party/webrtc/third_party/abseil-cpp/ LIBRARIES_PATH = -L../../third_party/webrtc/buildtools/third_party -L/home/stefan/webrtc-l4s/webrtc_native/m104/src/out/Default2/obj #use portable -pthread instead of classic -lpthread LIBS = -pthread -ldl -lX11 -L. -lwebrtc BIN_DIR = $(PWD)/Bin TARGET_BINARY = $(BIN_DIR)/demoWebrtc.bin all: $(TARGET_BINARY) @echo "[Build log] Target binary successfully built!" $(TARGET_BINARY): $(OBJ_FILES) @echo "[Build log] Linking..." @echo $(ADDITIONAL_OBJ_FILES) $(CC) $(LIBRARIES_PATH) -o $@ $^ $(LIBS) @echo "[Build log] Program linked!" $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp @echo "[Build log] Compiling..." $(CC) $(CFLAGS) $(INCLUDES_PATH) -c $< -o $@ @echo "[Build log] File" $< "compiled!" clean: rm -rf $(OBJ_DIR)/*.o rm -rf $(BIN_DIR)/*.bin
运行时错误信息
demoWebrtc.bin: ../nptl/pthread_mutex_lock.c:81: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed. Aborted (core dumped)
问题分析与疑问
错误指向WebRTC源码中src/rtc_base/synchronization/sequence_checker_internal.cc的SequenceCheckerImpl::IsCurrent()方法,表现为线程尝试重复获取已持有的互斥锁。已确认WebRTC实现及示例代码本身无问题,尝试常规线程问题解决方案无效。
疑问:
- 为何GN+Ninja构建该示例时无此问题?
- 自行构建过程中缺失了哪些关键环节?
内容的提问来源于stack exchange,提问作者Stefan Cosmin
相关产品推荐
相关产品推荐

