程序在libcrypto.so.3中崩溃,如何进行调试排查?
程序调用libcrypto.so.3崩溃的调试排查指导
崩溃日志
1: 2023-09-01 13:36:59 被终止的守护进程是/bin/xxq: 2: 2023-09-01 13:36:59 被终止的守护进程是/bin/aad: 5: 2023-09-01 13:40:25 <03376> 固件 TEST-VM64-KVM 6: 2023-09-01 13:40:25 (Debug) 7: 2023-09-01 13:40:25 <03376> 应用程序 newtest 8: 2023-09-01 13:40:25 <03376> *** 收到signal 11 (Segmentation fault) *** 9: 2023-09-01 13:40:25 <03376> 寄存器转储: 10: 2023-09-01 13:40:25 <03376> RAX: 0000000000000009 RBX: 00007fe47d87b000 11: 2023-09-01 13:40:25 <03376> RCX: 00007fe47d87b130 RDX: fffffffffffd9ef0 12: 2023-09-01 13:40:25 <03376> R08: 00007fe47d87b094 R09: 0000000004400000 13: 2023-09-01 13:40:25 <03376> R10: 0000000000000009 R11: 00007ffee143ede8 14: 2023-09-01 13:40:25 <03376> R12: 00007ffee143ef14 R13: 00007ffee143ee70 15: 2023-09-01 13:40:25 <03376> R14: 0000000000000010 R15: fffffffffffffff5 16: 2023-09-01 13:40:25 <03376> RSI: 0000000011067fd0 RDI: 0000000011067d50 17: 2023-09-01 13:40:25 <03376> RBP: 0000000011067d50 RSP: 00007ffee143edd0 18: 2023-09-01 13:40:25 <03376> RIP: 00007fe4832f6d2e EFLAGS: 0000000000010293 19: 2023-09-01 13:40:25 <03376> CS: 0033 FS: 0000 GS: 0000 20: 2023-09-01 13:40:25 <03376> Trap: 000000000000000e Error: 0000000000000006 21: 2023-09-01 13:40:25 <03376> OldMask: 0000000000000000 22: 2023-09-01 13:40:25 <03376> CR2: 0000000011068000 23: 2023-09-01 13:40:25 <03376> 栈: 0x7ffee143edd0 - 0x7ffee14589c0 24: 2023-09-01 13:40:25 <03376> 回溯信息: 25: 2023-09-01 13:40:25 <03376> [0x7fe4832f6d2e] => /usr/lib/x86_64-linux-gnu/libcrypto.so.3 26: 2023-09-01 13:40:25 liboffset 000cbd2e 27: 2023-09-01 13:40:25 <03376> [0x7fe48351432c] => /usr/lib/x86_64-linux-gnu/libcrypto.so.3 28: 2023-09-01 13:40:25 liboffset 002e932c 29: 2023-09-01 13:40:25 <03376> [0x7fe48356172c] => /usr/lib/x86_64-linux-gnu/libcrypto.so.3 30: 2023-09-01 13:40:25 liboffset 0033672c 31: 2023-09-01 13:40:25 <03376> [0x7fe48341a60e] => /usr/lib/x86_64-linux-gnu/libcrypto.so.3 32: 2023-09-01 13:40:25 (EVP_DecryptUpdate+0x0000009e) liboffset 001ef60e
调试排查步骤
1. 定位libcrypto内崩溃的具体函数
用addr2line工具将日志中的偏移地址转换为具体的源文件和行号:
addr2line -e /usr/lib/x86_64-linux-gnu/libcrypto.so.3 0x000cbd2e 0x002e932c 0x0033672c 0x001ef60e
通过输出结果明确崩溃在libcrypto内部的逻辑位置。
2. 用GDB进行实时调试
- 确保程序编译时添加了
-g参数生成调试符号,启动GDB:gdb ./newtest - 设置断点并运行程序,崩溃后查看完整调用栈:
b EVP_DecryptUpdate run bt - 用
info registers查看寄存器状态,结合CR2值(0x0000000011068000)检查该内存地址是否合法,排查野指针、已释放内存访问或越界问题。
3. 检查OpenSSL上下文与调用流程
- 确认
EVP_CIPHER_CTX对象是否通过EVP_CIPHER_CTX_new()正确初始化,且未被提前释放。 - 验证
EVP_DecryptUpdate的传入参数:输入输出缓冲区是否有效、长度参数是否合理,避免缓冲区越界。 - 核对解密流程顺序:是否先调用
EVP_DecryptInit_ex初始化上下文,再执行EVP_DecryptUpdate,无重复初始化或上下文篡改情况。
4. 检测内存异常
用valgrind检查内存问题:
valgrind --leak-check=full ./newtest
重点关注OpenSSL相关对象的内存操作,排查内存泄漏、野指针、越界访问等问题。
5. 验证OpenSSL版本兼容性
- 查看系统中libcrypto版本:
openssl version - 检查程序运行时依赖的libcrypto路径是否正确:
ldd ./newtest
确保编译时依赖的OpenSSL版本与运行时加载的版本一致,避免版本不兼容问题。
内容的提问来源于stack exchange,提问作者louis wang
相关产品推荐
相关产品推荐

