麒麟系统开发笔记(十一):在国产麒麟系统上使用gdb定位崩溃异常方法流程进阶定位代码行数及专项测试Demo
<div class="cl-preview-section"><h1>前言</h1>
</div>
<div class="cl-preview-section">
<p> 上一篇,通过研究,可以定位到函数,本篇进一步优化,没有行数,程序较为复杂的时候,就无法定位,所以进一步定位。<br> 本篇做了qBreakpad的研究,但是没有成功,过程也还是填出来,后来突然注意到gdb出现行数的方法,并通过了几轮测试以及实战,确实可以定位到行数,所以为了大家方便,把国企麒麟上的Qt崩溃方法分享出来。<br> 本篇文章比较长,就不分篇了,同时还做了专项测试。</p>
</div>
<div class="cl-preview-section"> </div>
<div class="cl-preview-section">
<h1>注意</h1>
</div>
<div class="cl-preview-section">
<p> 阅读者如果一开始有点懵,可能先要看先大致扫一下:《麒麟系统开发笔记(十):在国产麒麟系统上使用gdb定位崩溃异常方法流程以及测试Demo》,本篇也是解决上一篇探讨的遗留问题(只定位了函数,未定位代码行号)。</p>
</div>
<div class="cl-preview-section"> </div>
<div class="cl-preview-section">
<h1>使用gdb定位Qt的release(国产麒麟系统)</h1>
</div>
<div class="cl-preview-section">
<h2>步骤一:修改上一篇demo的pro配置</h2>
</div>
<div class="cl-preview-section">
<p> (这里是上一篇的demo,只关注红框的即可)<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627027-565686356.png"></p>
</div>
<div class="cl-preview-section">
<h2>步骤二:重新编译调试还是没有行号</h2>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090626958-1994055150.png"></p>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627009-322975697.png"></p>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627084-1870901422.png"></p>
</div>
<div class="cl-preview-section">
<p> 与没有-g的时候没有啥区别。</p>
</div>
<div class="cl-preview-section">
<h2>步骤三:多加几层调用追加堆栈测试</h2>
</div>
<div class="cl-preview-section">
<p> 修改下代码:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090626994-292039537.png"></p>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627036-1723556802.png"></p>
</div>
<div class="cl-preview-section">
<p> 测试:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090626944-1153804883.png"></p>
</div>
<div class="cl-preview-section">
<p> 还是没有堆栈信息:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627120-522618355.png"></p>
</div>
<div class="cl-preview-section">
<h2>步骤四:怀疑是release版本,改为debug测试</h2>
</div>
<div class="cl-preview-section">
<p> 改为debug版本,也没有:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627096-162100907.png"></p>
</div>
<div class="cl-preview-section">
<p> 不清楚原因,这里博主就没有深究了</p>
</div>
<div class="cl-preview-section">
<h2>步骤五:路回峰转,重启gdb,成功定位</h2>
</div>
<div class="cl-preview-section">
<p> 研究qBreakpad去了,但是qBreakpad也入深坑了,在爬坑的时候,突然注意到gdb的bt指令,所以研究了个把小时qBreakpad又折回来继续了。<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627051-915862470.png"><br> 至此,出现了行号:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627149-1385514622.png"></p>
</div>
<div class="cl-preview-section"> </div>
<div class="cl-preview-section">
<h1>配置调试发布专项测试</h1>
</div>
<div class="cl-preview-section">
<p> 为了确认最简单的方式,所以进行测试:</p>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-cpp">DEFINES <span class="token operator">+= QT_NO_DEBUG_OUTPUT
DEFINES <span class="token operator">+= QT_NO_WARN_OUTPUT
QMAKE_CXXFLAGS <span class="token operator">+= <span class="token operator">-g
<span class="token macro property"><span class="token directive-hash">#<span class="token expression">QMAKE_CXXFLAGS <span class="token operator">+= <span class="token operator">-g3
</span></span></span></span></span></span></span></span></span></code></pre>
</div>
<div class="cl-preview-section">
<h2>测试:debug版本,无-g,不屏蔽qt打印输出</h2>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627089-1770649271.png"></p>
</div>
<div class="cl-preview-section">
<h3>测试:debug版本,有-g的,不屏蔽qt打印输出</h3>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627077-1604808376.png"></p>
</div>
<div class="cl-preview-section">
<p> 有行号,行号跟函数在同一行。</p>
</div>
<div class="cl-preview-section">
<h3>测试:debug版本,有-g的,屏蔽qt打印输出</h3>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627043-2083108453.png"></p>
</div>
<div class="cl-preview-section">
<p> 有行号,行号跟函数在同一行。</p>
</div>
<div class="cl-preview-section">
<h3>测试:release版本,有-g/-g3,有qt屏蔽打印输出</h3>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-cpp"><span class="token macro property"><span class="token directive-hash">#<span class="token expression">DEFINES <span class="token operator">+= QT_NO_DEBUG_OUTPUT
<span class="token macro property"><span class="token directive-hash">#<span class="token expression">DEFINES <span class="token operator">+= QT_NO_WARN_OUTPUT
QMAKE_CXXFLAGS <span class="token operator">+= <span class="token operator">-g
<span class="token macro property"><span class="token directive-hash">#<span class="token expression">QMAKE_CXXFLAGS <span class="token operator">+= <span class="token operator">-g3
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627151-1176817822.png"></p>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627095-1578958372.png"></p>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627093-1617086499.png"></p>
</div>
<div class="cl-preview-section">
<p> 还试了下-g3:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090626968-2101024299.png"></p>
</div>
<div class="cl-preview-section">
<p> 定位了函数,不定位行号。</p>
</div>
<div class="cl-preview-section">
<h3>测试:release版本,有-g/-g3,未屏蔽qt打印输出</h3>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627039-1720562943.png"></p>
</div>
<div class="cl-preview-section">
<p> 所以,最终发现是不能屏蔽qt打印输出的,不然是没有的,跟release或者debug没有关系(没有去论证debug下屏蔽qt打印输出了)</p>
</div>
<div class="cl-preview-section">
<h3>测试:release版本,无-g,未屏蔽qt打印输出</h3>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627026-350965614.png"></p>
</div>
<div class="cl-preview-section">
<p> 所以,无-g也不行</p>
</div>
<div class="cl-preview-section">
<h1>模拟实战</h1>
</div>
<div class="cl-preview-section">
<p> 先加了一句代码:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627089-1858830987.png"></p>
</div>
<div class="cl-preview-section">
<p> 取消屏蔽qt打印,加上-g:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627025-365554733.png"></p>
</div>
<div class="cl-preview-section">
<p> 使用release编译后,运行崩溃:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627088-1920908100.png"></p>
</div>
<div class="cl-preview-section">
<p> 定位coredump文件:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627020-1929399969.png"></p>
</div>
<div class="cl-preview-section">
<p> 然后使用gdb的方法:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627186-339803276.png"><br> 这里得行是qlist.h的行号,不是我们代码的行号,所以下标错误估计就这样了。可以判断出,越界也是最后某个地方调用指针导致错误,所以越界当时是不会有问题,当越界在用越界调用的就把出错的指针调用出行数打出来。<br> 下面试试指针错误:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627124-875115513.png"></p>
</div>
<div class="cl-preview-section"> </div>
<div class="cl-preview-section">
<h1>专项测试结论</h1>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627086-297427544.png"></p>
</div>
<div class="cl-preview-section"> </div>
<div class="cl-preview-section">
<h1>入坑</h1>
</div>
<div class="cl-preview-section">
<h2>入坑一:gdb不出现行数</h2>
</div>
<div class="cl-preview-section">
<h3>问题</h3>
</div>
<div class="cl-preview-section">
<p> Gdb调试不出现行数</p>
</div>
<div class="cl-preview-section">
<h3>原因</h3>
</div>
<div class="cl-preview-section">
<ul>
<li>原因1:release与debug问题</li>
<li>原因2:-g问题</li>
<li>原因3:是否屏蔽qt打印问题<br> 1+2+3,导致情况多种,花了不少时间定位</li>
</ul>
</div>
<div class="cl-preview-section">
<h3>解决</h3>
</div>
<div class="cl-preview-section">
<p> 进行了专项测试论证,查看“专项测试论证”。</p>
</div>
<div class="cl-preview-section"> </div>
<div class="cl-preview-section">
<h1>qBreakpad(此方法未通,贴出来参考,有兴趣的读者可以继续往下走)</h1>
</div>
<div class="cl-preview-section">
<p> qBreakpad下载地址:https://github.com/buzzySmile/qBreakpad</p>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token function">git clone --recursive https://github.com/buzzySmile/qBreakpad.git
</span></code></pre>
</div>
<div class="cl-preview-section">
<p> 好像下下来有点问题,最后还是手动下载zip包了:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627122-202596836.png"></p>
</div>
<div class="cl-preview-section">
<p> qBreakpad依赖breakpad和lss<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627150-857775424.png"></p>
</div>
<div class="cl-preview-section">
<p> 下不下来,另外找把</p>
</div>
<div class="cl-preview-section">
<p> breakpad下载地址:https://github.com/google/breakpad</p>
</div>
<div class="cl-preview-section">
<p> (最新版报错),下载v2021.08.09版本</p>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090626970-1148955890.png"></p>
</div>
<div class="cl-preview-section">
<p> lss:https://github.com/ithaibo/linux-syscall-support<br> 下载来:<img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627085-300939377.png"></p>
</div>
<div class="cl-preview-section"> </div>
<div class="cl-preview-section">
<h1>编译qBreakpad库</h1>
</div>
<div class="cl-preview-section">
<h2>步骤一:下载解压</h2>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090626967-1931148200.png"></p>
</div>
<div class="cl-preview-section">
<h2>步骤二:复制改名依赖库</h2>
</div>
<div class="cl-preview-section">
<p> 复制过去并改名:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627098-1655126943.png"></p>
</div>
<div class="cl-preview-section">
<p> 改完后(先删除已经存在的):<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627117-1539711641.png"></p>
</div>
<div class="cl-preview-section">
<h2>步骤三:使用qtcreator打开qBreakpad编译</h2>
</div>
<div class="cl-preview-section">
<p> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090626968-1700885791.png"></p>
</div>
<div class="cl-preview-section">
<h2>步骤四:解决错误“undefined reference to `google_breakpad::PEFile::TryGetDebugInfo(xxxx”,继续编译</h2>
</div>
<div class="cl-preview-section">
<p> 怀疑是版本问题,降低版本试试:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627080-1896623762.png"></p>
</div>
<div class="cl-preview-section">
<p> 如下,下载解压后替换:<br> <img src="https://img2023.cnblogs.com/blog/1971530/202303/1971530-20230331090627122-487214216.png"></p>
</div>
<div class="cl-preview-section">
<h2>步骤五:解决错误“*** No rule to make target ‘xxx/minidump_file_writer.cc’, needed by ‘_build/obj/minidump_file_writer.o’. Stop.”</h2>
</div>
<div class="cl-preview-section">
<p> “*** No rule to make target ‘…/…/qBreakpad-master/third_party/breakpad/src/client/minidump_file_writer.cc’, needed by ‘_build/obj/minidump_file_writer.o’. Stop.”<br> <br> 那岂不是要降低qBreakpad的版本?试一试<br> 至此,突然发现gdb的bt,所以这边停止了。</p>
</div><br><br>
来源:https://www.cnblogs.com/qq21497936/p/17275136.html
頁:
[1]