You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定位C++程序中浮点异常(core dumped)的发生位置?

嘿,我太懂你这种面对C++“高冷”报错的无奈了——毕竟Python的报错信息连哪一行哪一个变量出问题都给你标得明明白白,对比起来C++默认的Floating point exception (core dumped)确实像个没头没脑的提示!别慌,这事儿其实很容易解决,你只需要做两件事就能拿到精准的错误定位:

第一步:用调试模式重新编译程序

没错,你确实需要重新编译,但过程很简单,核心就是给编译器加上调试信息参数:

  • 如果是直接用g++或clang++编译:在编译命令里加上-g参数,别加任何优化参数(比如-O2、-O3这类,优化会打乱代码行号,导致调试信息不准)。举个例子:
    g++ -g -o your_program your_source.cpp
    
  • 如果是用CMake构建的项目:在执行cmake的时候指定Debug模式,然后再编译:
    cmake -DCMAKE_BUILD_TYPE=Debug ..
    make
    

Debug模式下编译器会生成包含完整行号、函数名的调试信息,这是后续定位问题的基础。

第二步:用调试工具定位崩溃点

最常用的工具是gdb(GNU Debugger),操作超简单,跟着步骤来:

  1. 打开终端,启动gdb并加载你的程序:
    gdb ./your_program
    
  2. 在gdb的命令行里,输入run加上触发崩溃的特定输入(比如输入是一个文件,就带上文件路径):
    run path/to/your/problem_input.txt
    
  3. 程序崩溃后,输入bt(backtrace的缩写),你会看到完整的函数调用栈,每一行都会显示函数名、所在文件名、具体代码行号——就像Python的报错栈一样清晰!

举个例子,bt的输出可能会像这样:

#0  0x000055555555486f in calculate_value (a=0, b=10) at math_utils.cpp:42
#1  0x00005555555549a3 in main () at main.cpp:120

这就直接告诉你,崩溃发生在math_utils.cpp的第42行,是在calculate_value函数里,而且看起来是a的值为0,可能触发了除以0的操作。

如果你不想实时调试,也可以事后分析core dump文件:

  • 先设置允许生成core文件:
    ulimit -c unlimited
    
  • 运行你的程序,崩溃后会在当前目录生成一个叫core的文件
  • 用gdb加载这个core文件:
    gdb ./your_program core
    
  • 同样输入bt就能看到崩溃栈信息
小提示

浮点异常(Floating point exception)通常是这些情况导致的:除以0、对负数开平方、浮点数值溢出/下溢。拿到行号后,直接去看那一行的代码,大概率一眼就能找到问题~

内容的提问来源于stack exchange,提问作者Fuffi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:24:40