<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>GDB on Rancho&#39;s Notes</title>
    <link>https://fan-pengfei.top/tags/gdb/</link>
    <description>Recent content in GDB on Rancho&#39;s Notes</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 27 Feb 2023 12:04:31 +0000</lastBuildDate>
    <atom:link href="https://fan-pengfei.top/tags/gdb/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>在GDB下调试STM32的记录</title>
      <link>https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Mon, 27 Feb 2023 12:04:31 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;基于VSCode使用GDB来调试STM32，我感觉比那个Keil还好用，而且更懂底层原理；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一调试步骤&#34;&gt;一、调试步骤：&lt;/h2&gt;
&lt;h3 id=&#34;准备工作&#34;&gt;准备工作&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;已经熟悉arm gcc工具链；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;已经在win中安装好mingw或者arm-none-eabi-gcc工具；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;具有合适的代码工程和编译脚本，且编译输出elf文档时，已添加&lt;code&gt;-g&lt;/code&gt;选项来生成调试信息；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装jlink调试工具和对应驱动；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;有对应的硬件电路；&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;1启动jlink-gdb-server&#34;&gt;1、启动Jlink GDB Server&lt;/h3&gt;
&lt;p&gt;打开Jlink诸多工具中的Jlink GDB Server并配置好：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;e72631aa1f4bdb02354f118476623df&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;启动：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;42007dbdc5647b8720335665c84428f&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;可以看到本地端口为&lt;strong&gt;2331&lt;/strong&gt;，这个一会会用到；&lt;/p&gt;
&lt;p&gt;然后就可以把这个窗口最小化了；&lt;/p&gt;
&lt;h3 id=&#34;2gdb调试&#34;&gt;2、GDB调试&lt;/h3&gt;
&lt;p&gt;启动GDB程序：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;arm-none-eabi-gdb.exe
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;236f0b171cb512aca24824528019feb&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后按enter自动进入调试模式；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;89f35eeb649299594752d95cce23b1c&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-4.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;file H743_demo.elf&lt;/code&gt;加载调试文档：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;9a0c8d88bbf7814d61eb0344cfb34dd&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后输入&lt;code&gt;target remote localhost:2331&lt;/code&gt;，连接gdb server，连接成功后，会在Jlink GDB server中显示对应的状态，如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;f79eb5111b0dfb33e8b4f1c1b7aafab&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-6.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;monitor reset&lt;/code&gt;来复位MCU，从而让MCU处于确定的状态：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;4e26bf8c755ae990458b5659fa47de5&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-7.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;load&lt;/code&gt;往MCU中加载调试文档（是加载进flash,而不是ram），也就是常见的烧录过程：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;c6780b35ab50f7e2f5fc5193f69e5ec&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-15.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;break main&lt;/code&gt;设置main断点，让MCU执行到main中停止：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;aa8600b8137d1acda57d85b34589d8c&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-9.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;c&lt;/code&gt;持续运行直至运行到断点处：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;5de1ce9fb6048e1a442a4b876ea36a9&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-10.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;HAL_Init&lt;/strong&gt;();是main函数的第一行代码，停在这里；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;再次输入&lt;code&gt;c&lt;/code&gt;会继续运行；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2ab17a5b734305f89d325e492a6ad32&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-11.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;若要打断持续运行的状态，只需要按下&lt;code&gt;Ctrl+c&lt;/code&gt;即可；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;3需要注意的地方&#34;&gt;3、需要注意的地方&lt;/h3&gt;
&lt;p&gt;每次程序重新编译都要执行一次&lt;code&gt;load&lt;/code&gt;以加载新的elf文档；&lt;/p&gt;
&lt;p&gt;如果不使用命令行，而是使用VSCODE中的调试功能，则也需要在程序更新的时候重新&lt;code&gt;load&lt;/code&gt;一次；&lt;/p&gt;
&lt;h2 id=&#34;二常用命令&#34;&gt;二、常用命令&lt;/h2&gt;
&lt;h3 id=&#34;1p打印&#34;&gt;1、p(打印)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;p+变量名：打印变量值：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;d8c389e160cfaad354a0a486f0a6a72&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-12.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;2s单步运行&#34;&gt;2、s(单步运行)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;s：单步运行；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;d026be12be61623d766adf025ba11e5&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-13.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;并且可以用 &lt;code&gt;breakpoint+行号&lt;/code&gt;进行断点设置；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;3l列出&#34;&gt;3、l(列出)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;列出当前位置前后共5行程序；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;913f3b719d2d60aec6ff628a67ec0bc&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9C%A8gdb%E4%B8%8B%E8%B0%83%E8%AF%95stm32%E7%9A%84%E8%AE%B0%E5%BD%95/img-14.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;4watch变量监视&#34;&gt;4、watch(变量监视)&lt;/h3&gt;
&lt;p&gt;Watchpoints 是用来告诉 &lt;strong&gt;GDB&lt;/strong&gt; 停止执行某个程序的标记。Watchpoints 与数据相关联：放置监视点需要指定一个表达式来描述变量、多个变量或内存地址。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
