使用海湾合作委员会进行消毒,导致意外提前退出
fsanitize with gcc causing unexpected early exit
我有一个错误,在无效堆指针上调用free()
时,该错误无法始终重现。 用有问题的代码从根本上说,将这个问题减少到"最小"是不可能的——(一旦我这样做了,它就解决了(。 我无法发现任何明显的问题(例如从未调用calloc
的潜在情况,或双重免费等......
我相信valgrind
可以解决这个问题,除了性能影响太极端(这些是超时的客户端>服务器调用,以及开始时成本高昂的操作......在某些情况下需要>4 秒(
这让我fsanitize=address
,我相信吗? 到目前为止,我的经验是...不是很好。
我得到的是两个静态库和一个与它们链接的可执行文件。 我已经为他们三个打开了fsanitize=address
。 使用-fsanitize=address
,代码在经过非常彻底测试和正确的初始化例程期间(在 256 字节memcpy
到 16 meg 堆分配的中间(在调试器下干净地退出 - 退出代码 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;--它奏效了。 我有两个基本问题:
-
fsanitize 正在输出有关其退出原因的全面错误信息。 这被
nginx
吞下了...在我们的自定义版本中,它被重定向到一个模糊的日志文件。 不知道为什么在gdb
下我没有调试中断,但尽管如此......它正在检测到一个合法的错误。 此处的关键信息:在__asan_report_error
中设置断点将在退出之前停止程序,以便您可以检查各种帧。 -
虽然初始化例程是正确的并且经过了大量测试,但正如我所提到的,它确实要求其客户端正确分配(非平凡的(配置结构。 在这种情况下,结构距离完成少 1 个字节,导致 1 个字节过度读取。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在C++中对T*类型执行std::move的意外行为
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 如何让LLDB在成功时退出,在失败时等待
- C++控制台应用程序阻止退出
- 程序在执行程序的其余部分之前退出
- 处理除以零会导致<csignal>意外行为
- 构造函数在退出函数时无法初始化一个参数
- 使用vscode调试时,GDB意外退出
- C++ 程序意外退出
- 使用海湾合作委员会进行消毒,导致意外提前退出
- Qt - 意外的 GDB 退出
- PHP7 和 IIS8 HTTP 错误 500.0 - FastCGI 进程意外退出
- Xcode 6 在我按下输出窗口后意外退出
- 在 g++ 中使用 -pass-exit-code 时出现意外的退出状态
- 在lxc容器上调试意外退出且没有错误的C++程序
- 如何监视意外退出的线程
- Visual Studio 2015+libtcod-意外退出