<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>调试 on To the Moon</title><link>https://pycv.github.io/blog/tags/%E8%B0%83%E8%AF%95/</link><description>Recent content in 调试 on To the Moon</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 14 Mar 2026 16:20:15 +0800</lastBuildDate><atom:link href="https://pycv.github.io/blog/tags/%E8%B0%83%E8%AF%95/index.xml" rel="self" type="application/rss+xml"/><item><title>一个数组越界，竟让我排查了几天——嵌入式段错误定位实录</title><link>https://pycv.github.io/blog/excerpts/2026-03-14-embedded-segmentation-fault-debugging/</link><pubDate>Sat, 14 Mar 2026 16:19:35 +0800</pubDate><guid>https://pycv.github.io/blog/excerpts/2026-03-14-embedded-segmentation-fault-debugging/</guid><description>&#10; &lt;blockquote&gt;&#10; &lt;p&gt;本文由 AI 自动摘录整理，原始链接：&lt;a class="link" href="https://mp.weixin.qq.com/s/7cFIPWiEzTIJQEHmR7gOjQ" target="_blank" rel="noopener"&#10; &gt;一个数组越界，竟让我排查了几天&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;推荐指数&lt;/strong&gt;：8/10（推荐读原文）&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="背景"&gt;背景&#10;&lt;/h2&gt;&lt;p&gt;程序跑了几天好好的，换个位置就段错误死机。屏蔽两行三角函数代码就正常，打开就必崩——但问题根源和那两行代码毫无关系。最终真凶是一个&amp;quot;隔山打牛&amp;quot;式的数组越界。&lt;/p&gt;&#10;&lt;h2 id="核心观点"&gt;核心观点&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;打印法可能把你带偏&lt;/strong&gt;：屏蔽代码后&amp;quot;不崩了&amp;quot;，只是切断了越界的触发路径，并没有解决根本问题。表象往往和根因相隔甚远。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;远程 GDB 精确定位崩溃点&lt;/strong&gt;：gdbserver + VSCode 远程调试，段错误发生时能精确知道崩溃的代码行号，比打印法更可靠。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;数组越界&amp;quot;隔山打牛&amp;quot;&lt;/strong&gt;：一个 5 元素的 float 数组 &lt;code&gt;arr&lt;/code&gt;，实际写到了 &lt;code&gt;arr[5]&lt;/code&gt;、&lt;code&gt;arr[6]&lt;/code&gt;、&lt;code&gt;arr[7]&lt;/code&gt;、&lt;code&gt;arr[8]&lt;/code&gt;。而 &lt;code&gt;arr[8]&lt;/code&gt; 的地址正好是静态全局变量 &lt;code&gt;fd&lt;/code&gt; 的地址，写入操作直接篡改了 &lt;code&gt;fd&lt;/code&gt; 的值，导致段错误。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="关键技巧"&gt;关键技巧&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;-fdata-sections 编译参数&lt;/strong&gt;：让每个变量放到独立的 section 中，链接器生成 map 文件时就会包含 static 变量的地址信息，方便分析内存布局。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;AddressSanitizer（-fsanitize=address）&lt;/strong&gt;：对付内存类 bug 的&amp;quot;大杀器&amp;quot;，会直接报出数组越界的精确位置和调用栈，可能 10 分钟就能定位根因。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="调试工具速查表"&gt;调试工具速查表&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;工具/方法&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;适用场景&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;优势&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;log 打印法&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;快速初筛&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;简单直接，零成本&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;远程 GDB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;精确定位崩溃行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;可看调用栈和变量值&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;core dump + gdb&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;事后分析&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不需要复现，离线分析&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;strace&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;系统调用级跟踪&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;排查文件/网络/权限问题&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AddressSanitizer&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;内存越界/溢出/UAF&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;编译期插桩，精确到行&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;map 文件 + -fdata-sections&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;分析变量内存布局&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看 static 变量地址&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="经验总结"&gt;经验总结&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;表象 ≠ 根因&lt;/strong&gt;：通过屏蔽/打开某些代码来定位问题时，看到的可能只是 bug 的表象。要多思考&amp;quot;为什么&amp;quot;，从根本上解决。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;选对工具事半功倍&lt;/strong&gt;：打印法虽然常用，但遇到内存踩踏类 bug 时容易把人带偏。远程 GDB 和 map 文件是更高效的手段。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;AI 辅助排查&lt;/strong&gt;：有明显代码缺陷的代码，AI review 分分钟就能检测出来。结对分析可以让 AI 检查可疑代码是否存在缺陷。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;&lt;em&gt;摘录时间：2026-03-14&lt;/em&gt;&lt;/p&gt;&#10;</description></item></channel></rss>