我有一个错误,在一个无效的堆指针上调用free()
时不能始终如一地重现。将问题简化为“最小化”从根本上说不可能使用相关代码 - (一旦我完成了,它就解决了)。我无法发现任何明显的问题(例如从未调用calloc
或双重免费等的潜在案例......)
我相信valgrind
将是一个解决方案,除了性能影响太极端(这些是超时的客户端 - >服务器调用,以及开始时昂贵的操作...>在某些情况下> 4秒)
这让我留下fsanitize=address
,我相信?到目前为止,我的经历是......并不是很好。
我得到的是两个静态库和一个与它们链接的可执行文件。我为他们三个人打开了fsanitize=address
。使用-fsanitize=address
,代码在一个经过彻底测试和正确的init例程(在256字节的memcpy
中间进入16兆的堆分配 - 退出代码1)中在调试器下干净地退出。
任何有使用fsanitize
实践经验的人都能为我提供有关问题所在的提示吗?我在cmake下使用gcc / ld,代码是(基本上)用C ++编译的C代码。切换到clang可能是一个选择,如果这可能会改善一些事情。
典型的文件编译命令:
"command": "/usr/bin/c++ -I. -I/home/redacted -fpermissive -g -g3 -fasynchronous-unwind-tables -fsanitize=address
-std=gnu++11 -o core/CMakeFiles/nginx_core.dir/src/core/nginx.cpp.o -c /home/redacted.cpp",
我只是留在这里为未来的搜索者与fsanitize
有问题。 tldr; - 它奏效了。我有两个基本问题:
nginx
吞噬了......在我们的定制版本中,它被重定向到一个不起眼的日志文件。不知道为什么在gdb
下我没有得到调试中断,但不过......它正在检测出一个合法的错误。这里的关键信息:在__asan_report_error
中设置断点将在退出之前暂停程序,以便您可以检查各种帧。