问题:调试时堆栈显示 libzmq. so 为 ???,导致难以排查问题
解决步骤:
- 编译对应版本的 libzmq. so(带调试符号)
- 将编译好的库文件传输到开发板的
/home/efort/lib目录 - 设置动态链接库搜索路径
补充建议
1. 编译时添加调试符号
确保编译 libzmq 时包含调试信息:
bash
# 编译时添加 -g 选项
CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix=/your/install/path
make
make install 2. 永久设置 LD_LIBRARY_PATH
为避免每次都要手动设置,可以将路径添加到配置文件:
bash
# 添加到 ~/.bashrc 或 ~/.profile
echo 'export LD_LIBRARY_PATH=/home/efort/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc 3. 验证符号加载
调试时可以验证符号是否正确加载:
bash
# 使用 gdb 检查
gdb your_program
(gdb) info sharedlibrary
# 查看 libzmq.so 是否显示符号已加载
# 或使用 nm 检查符号表
nm -D /home/efort/lib/libzmq.so | grep -i "function_name" 4. 替代方案:使用 ldconfig
如果有 root 权限,可以使用 ldconfig:
bash
# 添加库路径到系统配置
sudo echo "/home/efort/lib" > /etc/ld.so.conf.d/libzmq.conf
sudo ldconfig 5. 检查库版本匹配
确保编译的库版本与程序链接的版本一致:
bash
ldd your_program | grep libzmq 堆栈信息
调试时堆栈显示 libzmq.so 为 ???,不好排查的解决方案
找到对应版本的 libzmq 编译 libzmq.so
scp 到开发板
/home/efort/lib设置链接库搜索路径:
bash
export LD_LIBRARY_PATH=/home/efort/lib:$LD_LIBRARY_PATH - 观察进程 fd 情况
- fd 增长时 gdb attach
c++
(gdb) bt
#0 0x0000ffffa8401098 in __GI___poll (fds=0xffffa6a42e68, nfds=1, timeout=<optimized out>) at ../sysdeps/unix/sysv/linux/poll.c:41
#1 0x0000ffffa82767a4 in zmq::signaler_t::wait (this=0xffff540116a8, timeout_=-1) at /home/user/workspace/libzmq/src/signaler.cpp:242
#2 0x0000ffffa824546c in zmq::mailbox_t::recv (this=0xffff54011640, cmd_=0xffffa6a42f40, timeout_=-1) at /home/user/workspace/libzmq/src/mailbox.cpp:81
#3 0x0000ffffa827bc18 in zmq::socket_base_t::process_commands (this=0xffff5400d1a0, timeout_=-1, throttle_=false) at /home/user/workspace/libzmq/src/socket_base.cpp:1365
#4 0x0000ffffa827b228 in zmq::socket_base_t::send (this=0xffff5400d1a0, msg_=0xffffa6a43108, flags_=2) at /home/user/workspace/libzmq/src/socket_base.cpp:1158
#5 0x0000ffffa82a52c0 in s_sendmsg (s_=0xffff5400d1a0, msg_=0xffffa6a43108, flags_=2) at /home/user/workspace/libzmq/src/zmq.cpp:338
#6 0x0000ffffa82a6170 in zmq_msg_send (msg_=0xffffa6a43108, s_=0xffff5400d1a0, flags_=2) at /home/user/workspace/libzmq/src/zmq.cpp:592
#7 0x0000ffffa827d638 in zmq::socket_base_t::monitor_event (this=0xffff5400a160, event_=1024, values_=0xffffa6a43188, values_count_=1, endpoint_uri_pair_=...)
at /home/user/workspace/libzmq/src/socket_base.cpp:1855
#8 0x0000ffffa827d8e4 in zmq::socket_base_t::stop_monitor (this=0xffff5400a160, send_monitor_stopped_event_=true) at /home/user/workspace/libzmq/src/socket_base.cpp:1911
#9 0x0000ffffa8277edc in zmq::socket_base_t::~socket_base_t (this=0xffff5400a160, __in_chrg=<optimized out>) at /home/user/workspace/libzmq/src/socket_base.cpp:284
#10 0x0000ffffa8238e98 in zmq::dealer_t::~dealer_t (this=0xffff5400a160, __in_chrg=<optimized out>) at /home/user/workspace/libzmq/src/dealer.cpp:43
#11 0x0000ffffa8238ed0 in zmq::dealer_t::~dealer_t (this=0xffff5400a160, __in_chrg=<optimized out>) at /home/user/workspace/libzmq/src/dealer.cpp:45
#12 0x0000ffffa8258340 in zmq::own_t::process_destroy (this=0xffff5400a160) at /home/user/workspace/libzmq/src/own.cpp:211
#13 0x0000ffffa827c64c in zmq::socket_base_t::check_destroy (this=0xffff5400a160) at /home/user/workspace/libzmq/src/socket_base.cpp:1577
#14 0x0000ffffa827c4cc in zmq::socket_base_t::in_event (this=0xffff5400a160) at /home/user/workspace/libzmq/src/socket_base.cpp:1550
#15 0x0000ffffa823d9e8 in zmq::epoll_t::loop (this=0xaaaadb6d0f90) at /home/user/workspace/libzmq/src/epoll.cpp:206
#16 0x0000ffffa8261bb4 in zmq::worker_poller_base_t::worker_routine (arg_=0xaaaadb6d0f90) at /home/user/workspace/libzmq/src/poller_base.cpp:139
#17 0x0000ffffa8292208 in thread_routine (arg_=0xaaaadb6d0fe8) at /home/user/workspace/libzmq/src/thread.cpp:225
#18 0x0000ffffa8dbe624 in start_thread (arg=0xffffa82920cc <thread_routine(void*)>) at pthread_create.c:477
#19 0x0000ffffa840a62c in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:78 