STM32CubeIDE 使用 dap 通过 openocd 调试

需求 最近使用 stm32u575 芯片的时候,调试时发现很尴尬的问题, jlink 必须安装高版本,然后盗版的就不能用了。MDK 可以直接使用 DAPLink,但是 stm32cubeide 不能直接支持。所以需要想办法解决这个问题。 解决 参考了网上的资料,st 自带的 openocd 不能用,端口不对。 openocd 需要下载官方的 openocd,不要使用 stm32cubeide 自带的。下载地址: https://gnutoolchains.com/arm-eabi/openocd/ 。下载后自行安装。 配置 openocd stm32cubeide 菜单栏 -> Run -> External Tools -> External Tools Configrations -> Program 右键 -> New Configration. Name 自己输入。 Location: 选择刚才下载的 openocd 中的 openocd.exe 所在路径。 Arguments: -f interface\cmsis-dap.cfg -f target\stm32u5x.cfg apply 然后 Run. 配置 debug Run -> Debug Configurations -> GDB Hardware Debugging 右键 -> New Configuratin....

<span title='2023-10-10 15:38:00 +0800 CST'>2023-10-10</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;168 words&nbsp;·&nbsp;RamLife

gdb 调试崩溃产生的 core 文件

需求 程序崩溃后,希望知道程序到底是因为什么崩溃的,首先需要找到崩溃后的 core 文件,然后调试加载 core 文件。 解决 先在软件的目录寻找 core 文件,如果没有按照下面的步骤来处理。 确认开启了 core 查看当前允许的 core 文件的最大大小。 ulimit -c 设定固定值或者不限制, 单位是 KB ulimit -c 1024 ulimit -c unlimited 确认 core 文件路径 如果文件路径类似下面这样的,就说明 core 被系统转存了,需要专门导出 cat /proc/sys/kernel/core_pattern |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %e 导出 core 导出需要使用 coredumpctl, 如果没有安装,使用如下命令: sudo apt install systemd-coredump 使用 coredumpctl, 查看崩溃的 pid, 如果显示的不完整,可以使用方向键来查看未完信息。 如果崩溃的 pid 为 1234, 并且导出的文件名为 core_2023 coredumpctl -o core_2023 dump 1234 加载 core 如果可执行文件名为 main, 崩溃文件为 core_2023....

<span title='2023-03-21 15:43:00 +0800 CST'>2023-03-21</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;88 words&nbsp;·&nbsp;RamLife

gdb list 显示指定文件或函数

需求 当多个文件编译后,需求调试的时候,需要 b 来打断点,但是前提是通过 list 翻到代码所在行。默认的 list 每次的行数太少,而且也不是一下子就能翻到。 解决 指定文件 可以直接指定源文件的某一行进行 list. 比如需要查看 a.cpp 的 100行。 gdb> list a.cpp:100 指定函数 可以直接指定查看某个函数,比如查看 Pack 这个函数。 gdb> list Pack 参考 gdb中list用法 GDB单步调试程序

<span title='2023-03-21 15:20:00 +0800 CST'>2023-03-21</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;29 words&nbsp;·&nbsp;RamLife

[转] C++ 或 QT 判断当前模式是Debug还是Release模式

需求 在构建版本的时候,需要在 debug 和 release 版本中有不一样的地方,这时候就需要使用宏来自动识别并展开对应的语句。 解决 C++ #ifdef DEBUG cout << "Debug!" << endl; #else cout << "Release!" << endl; #endif Qt #ifdef QT_DEBUG cout << "Debug!" << endl; #else cout << "Release!" << endl; #endif 参考 C++ 或 QT 判断当前模式是Debug还是Release模式

<span title='2023-03-06 15:13:00 +0800 CST'>2023-03-06</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;42 words&nbsp;·&nbsp;RamLife

syslog 使用及宏

需求 syslog 虽然使用起来很方便,但是直接使用有几个问题: 虽然有日志信息,但是不够全面不方便定位 那么多的日志都混在一起,没有重点,调试时不方便 debug 和 release 时,日志应该不一样。 解决 日志信息更丰富 syslog 可以使用 __FILE__, __LINE__, __FUNCTION, 这几个来标识出当前的日志是在那个文件,第几行,哪个函数输出的。 syslog(LOG_DEBUG, "%s: %d: %s --> class construct", __FILE__, __LINE__, __FUNCTION__); 使用宏来开关日志 下面这个是普通替代的宏,可以用于开关日志. #ifdef xxx #define LOG(priority, format, ...) syslog(priority, format, ## __VA_ARGS__) #else #define LOG(priority, format, ...) #endif 使用宏来减少输入 但是每条日志都要这样写,就太麻烦了,我们可以使用宏来解决这个问题: #define LOG(priority, format, ...) syslog(priority, "%s: %d: %s --> "#format, __FILE__, __LINE__, __FUNCTION__, ## __VA_ARGS__) LOG(LOG_DEBUG, "class construct"); 上面这条宏,我们在使用时,不需要显式的写出相关的参数,宏展开的时候,会自动帮我们加上这些参数,日志会包含文件名,行号,函数名. 使用宏增加日志等级 当多条日志信息在一起的时候,比较难抓住重点,虽然可以使用搜索,但是终归没有那么方便。我们可以通过宏给日志消息里面附上对应的等级,也方便后期维护时使用脚本进行解析。 #define LOG(priority, format, ....

<span title='2023-03-06 15:02:00 +0800 CST'>2023-03-06</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;223 words&nbsp;·&nbsp;RamLife