fdebug 调试器使用

本文详细介绍了如何通过修改fdebug源代码,将原本通过串口连接的方式改为通过pipe连接,从而简化调试过程。具体步骤包括修改Rs232OpenPortWin32函数和注释掉不必要的配置函数,最终通过调整freeldr.rebuild文件实现编译并使用改进后的fdebug。此方法适用于使用reactos进行调试时提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

reactos 源码带了一个调试工具fdebug, 这个调试器原本是通过串口来连接reactos,但实际上这种方式很麻烦,必须要有两台机器。比较好的方式就是通过虚拟机用pipe方式来调试,但首先就要修改fdebug的源代码,改为通过pipe来连接,打开rs232.c 文件,找到Rs232OpenPortWin32函数:

[cpp]  view plain copy
  1. BOOL Rs232OpenPortWin32(TCHAR* CommPort)  
  2. {  
  3.     TCHAR   PortName[MAX_PATH];  
  4.     DWORD   ErrorCode;  
  5.   
  6.     // First check and make sure they don't already have the  
  7.     // OBD2 connection open. We don't want to open things twice.  
  8.     if (hPortHandle != NULL)  
  9.     {  
  10.         _tprintf(TEXT("Port handle not NULL. Must be already open. Returning FALSE...\n"));  
  11.         return FALSE;  
  12.     }  
  13.   
  14.     _stprintf(PortName, TEXT("\\\\.\\%s"), CommPort);  
  15.   
  16.     hPortHandle = CreateFile(PortName,  
  17.                             GENERIC_READ|GENERIC_WRITE,  
  18.                             0,  
  19.                             0,  
  20.                             OPEN_EXISTING,  
  21.                             0,  
  22.                             0);  
  23.   
  24.     if (hPortHandle == INVALID_HANDLE_VALUE)  
  25.     {  
  26.         hPortHandle = NULL;  
  27.         ErrorCode = GetLastError();  
  28.   
  29.         _tprintf(TEXT("CreateFile(\"%s\") failed. GetLastError() = %lu.\n"), PortName, ErrorCode);  
  30.   
  31.         return FALSE;  
  32.     }  
  33.   
  34.     return TRUE;  
  35. }  

这儿可以把PortName 改为\\\.\\pipe\com1;

然后在fdebug.c 的Rs232Thread函数处:

[cpp]  view plain copy
  1. VOID Rs232Thread(VOID* Parameter)  
  2. {  
  3.     BYTE    Byte;  
  4.     TCHAR   String[MAX_PATH];  
  5.     MSG     msg;  
  6.     DWORD   dwNumberOfBytesWritten;  
  7.   
  8.           UNREFERENCED_PARAMETER(Parameter);  
  9.   
  10.     dwThreadId = GetCurrentThreadId();  
  11.   
  12.     if (!Rs232OpenPortWin32(strComPort))  
  13.     {  
  14.         MessageBox(hMainWnd, TEXT("Error opening port!"), TEXT("Error"), MB_OK|MB_ICONSTOP);  
  15.         bConnected = FALSE;  
  16.         return;  
  17.     }  
  18.   
  19.     //_stprintf(String, TEXT("%s,n,8,1"), strBaudRate); 注释掉这儿  
  20.     //if (!Rs232ConfigurePortWin32(String))  
  21.     //{  
  22.     //  MessageBox(hMainWnd, TEXT("Error configuring port!"), TEXT("Error"), MB_OK|MB_ICONSTOP);  
  23.     //  bConnected = FALSE;  
  24.     //  return;  
  25.     //}                                                注释掉这儿  
  26.   
  27.     while (bConnected)  
  28.     {  
  29.         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))  
  30.         {  
  31.             if (msg.message == WM_CHAR)  
  32.             {  
  33.                 Rs232WriteByteWin32((BYTE)msg.wParam);  
  34.   
  35.                 if (bLocalEcho && msg.wParam != (WPARAM)TEXT('\r'))  
  36.                 {  
  37.                     PostMessage(hDisplayWnd, WM_CHAR, (WPARAM)msg.wParam, (LPARAM)0);  
  38.   
  39.                     if (hCaptureFile)  
  40.                     {  
  41.                         WriteFile(hCaptureFile, &msg.wParam, sizeof(TCHAR), &dwNumberOfBytesWritten, NULL);  
  42.                     }  
  43.                 }  
  44.             }  
  45.         }  
  46.   
  47.         if (Rs232ReadByteWin32(&Byte))  
  48.         {  
  49.             _stprintf(String, TEXT("%c"), Byte);  
  50.   
  51.             PostMessage(hDisplayWnd, WM_CHAR, (WPARAM)String[0], (LPARAM)0);  
  52.   
  53.             if (hCaptureFile)  
  54.             {  
  55.                 WriteFile(hCaptureFile, &String[0], sizeof(TCHAR), &dwNumberOfBytesWritten, NULL);  
  56.             }  
  57.         }  
  58.     }  
  59.   
  60.     dwThreadId = 0;  
  61.     Rs232ClosePortWin32();  
  62. }  


 

注释掉对 Rs232ConfigurePortWin32() 的调用。因为对pipe来说,是不用配置这样的参数的,然后就可以编译了。

 

默认情况下,fdebug并不会编译的(看来reactos本身是想淘汰掉这种调试工具,因为现在有了其他调试工具ReactosDBG)

打开freeldr目录下的freeldr.rebuild,增加如下的命令:

<directory name="fdebug">
 <xi:include href="fdebug/fdebug.rbuild" />
 </directory>

保存退出,在编译环境下执行:

make  freeldr_fdebug

这样就可以用了

<think>我们正在讨论如何使用Cortex-Debug调试器进行调试。根据引用内容,Cortex-Debug是一个用于VSCode的扩展插件,支持ARM Cortex-M和Cortex-A系列微控制器的调试。它需要配合硬件调试器(如J-Link、ST-LINK、CMSIS-DAP)使用。 根据引用[2],配置Cortex-Debug主要分为两步: 1. 配置GDB的路径(必须,因为它是核心调试程序) 2. 根据硬件调试器类型选择并配置对应的GDB Server(如JLinkGDBServer或OpenOCD) 此外,还需要在VSCode中配置launch.json文件来启动调试。 接下来,我将详细说明配置步骤: ### 步骤1:安装必要的工具 1. 在VSCode扩展商店中搜索并安装Cortex-Debug扩展。 2. 安装ARM GNU Toolchain(GCC编译工具链),其中包含GDB调试器。下载地址:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads 3. 根据你的硬件调试器安装对应的驱动和GDB Server: - 如果使用J-Link,需要安装J-Link软件包(包含JLinkGDBServer):https://www.segger.com/downloads/jlink/ - 如果使用ST-LINK或CMSIS-DAP等,可以安装OpenOCD:https://openocd.org/ ### 步骤2:配置Cortex-Debug 在VSCode中,打开用户设置(settings.json),配置GDB和GDB Server的路径。例如: ```json { "cortex-debug.armToolchainPath": "C:/Program Files (x86)/GNU Arm Embedded Toolchain/10 2021.10/bin", // 如果你使用JLinkGDBServer,配置JLinkGDBServer路径 "cortex-debug.JLinkGDBServerPath": "C:/Program Files (x86)/SEGGER/JLink_V786e/JLinkGDBServerCL.exe", // 如果你使用OpenOCD,配置OpenOCD路径 "cortex-debug.openocdPath": "C:/OpenOCD/bin/openocd.exe" } ``` 注意:根据你的安装路径进行调整。 ### 步骤3:配置launch.json 在VSCode中,打开你的项目,然后进入调试视图,点击“创建launch.json文件”,选择“Cortex-Debug”。然后配置launch.json文件。 以下是一个使用JLinkGDBServer调试STM32的示例配置: ```json { "version": "0.2.0", "configurations": [ { "name": "Debug (J-Link)", "cwd": "${workspaceRoot}", "executable": "${workspaceRoot}/build/your_project.elf", "request": "launch", "type": "cortex-debug", "servertype": "jlink", "device": "STM32F407VG", // 替换为你的设备型号 "interface": "swd", "ipAddress": null, "serialNumber": null, "runToEntryPoint": "main", "gdbPath": "arm-none-eabi-gdb" // 如果前面设置了armToolchainPath,这里可以只写gdb文件名 } ] } ``` 以下是一个使用OpenOCD调试ST-LINK的示例配置: ```json { "version": "0.2.0", "configurations": [ { "name": "Debug (ST-Link)", "cwd": "${workspaceRoot}", "executable": "${workspaceRoot}/build/your_project.elf", "request": "launch", "type": "cortex-debug", "servertype": "openocd", "device": "stm32f4x", // OpenOCD设备名称 "configFiles": [ "interface/stlink.cfg", "target/stm32f4x.cfg" ], "runToEntryPoint": "main", "gdbPath": "arm-none-eabi-gdb" } ] } ``` ### 步骤4:开始调试 1. 将硬件调试器连接到目标板,并确保连接正常。 2. 在VSCode中,选择对应的调试配置(如“Debug (J-Link)”或“Debug (ST-Link)”),然后点击运行。 3. 调试器将启动,并停在程序的入口点(如果配置了`runToEntryPoint`,则会停在main函数)。 在调试过程中,你可以使用VSCode的调试界面进行单步执行、设置断点、查看变量和寄存器等操作。 注意:具体的配置参数(如设备型号、接口类型、OpenOCD的配置文件等)需要根据你的硬件和目标芯片进行调整。 引用[2]中提到,配置时只需要根据硬件调试器类型选择一种GDB Server进行配置即可。同时,在launch.json中,`servertype`字段需要与选择的GDB Server对应(如`jlink`或`openocd`)。 希望这个教程能帮助你开始使用Cortex-Debug进行调试。如果遇到问题,可以查阅Cortex-Debug的官方文档或GitHub仓库。 §§相关问题§§ 1. 如何解决Cortex-Debug连接不上目标设备的问题? 2. Cortex-Debug支持哪些硬件调试器? 3. 如何在Cortex-Debug中查看外设寄存器?</think>### Cortex-Debug调试器使用教程 #### **1. 安装与基础配置** 1. **安装扩展** 在VSCode扩展商店搜索安装 **Cortex-Debug**(需VSCode版本≥1.50)[^1]。 2. **安装依赖工具** - **GDB调试器**:下载ARM GNU工具链(如`arm-none-eabi-gdb`)[^2] [下载地址](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads) - **GDB Server**(根据硬件选择): - **J-Link用户**:安装[SEGGER J-Link驱动](https://www.segger.com/downloads/jlink/)(含`JLinkGDBServer`) - **ST-LINK/CMSIS-DAP用户**:安装[OpenOCD](https://openocd.org/) 3. **配置路径** 在VSCode的`settings.json`中添加: ```json { "cortex-debug.armToolchainPath": "C:/your_path/arm-gnu-toolchain/bin", // GDB路径 "cortex-debug.JLinkGDBServerPath": "C:/Program Files/SEGGER/JLink/JLinkGDBServerCL.exe", // J-Link专用 "cortex-debug.openocdPath": "C:/your_path/openocd/bin/openocd.exe" // OpenOCD路径 } ``` --- #### **2. 调试配置(launch.json)** 创建`.vscode/launch.json`,根据硬件选择配置模板: **示例1:使用J-Link调试** ```json { "version": "0.2.0", "configurations": [ { "name": "JLink Debug", "cwd": "${workspaceFolder}", "executable": "./build/your_firmware.elf", // 编译生成的ELF文件 "request": "launch", "type": "cortex-debug", "servertype": "jlink", // 硬件类型 "device": "STM32F407VG", // 目标芯片型号 "interface": "swd", // 调试接口(SWD/JTAG) "gdbPath": "arm-none-eabi-gdb" } ] } ``` **示例2:使用ST-LINK + OpenOCD调试** ```json { "version": "0.2.0", "configurations": [ { "name": "STLink Debug", "cwd": "${workspaceFolder}", "executable": "./build/your_firmware.elf", "request": "launch", "type": "cortex-debug", "servertype": "openocd", "device": "stm32f4x", // OpenOCD设备名称 "configFiles": [ // OpenOCD配置文件 "interface/stlink.cfg", "target/stm32f4x.cfg" ] } ] } ``` --- #### **3. 启动调试** 1. 将开发板通过调试器(如ST-LINK)连接电脑。 2. 在VSCode中按`F5`,选择配置好的调试方案(如`JLink Debug`)。 3. **调试功能**: - **断点**:在代码行号左侧单击设置 - **寄存器查看**:调试面板→`Cortex-Debug Registers` - **外设寄存器**:调试面板→`Cortex-Debug SVD`(需加载SVD文件) - **实时变量监控**:添加到`Watch`窗口 --- #### **4. 高级功能** - **SVD外设视图** 在`launch.json`添加SVD文件路径(芯片厂商提供): ```json "svdFile": "./path/to/STM32F4xx.svd" ``` - **多核调试** 通过`"cores": ["core0", "core1"]`指定多个内核[^3]。 - **自定义OpenOCD命令** 使用`"openOCDPreConfigLaunchCommands": ["reset halt"]`预执行命令。 --- #### **常见问题解决** - **连接失败**: - 检查硬件连接与供电 - 确认`device`字段的芯片型号拼写正确 - 更新调试器固件(如ST-LINK的固件升级) - **GDB路径错误**: 在`settings.json`中检查`cortex-debug.armToolchainPath`是否指向`bin`目录 > 提示:完整配置参考见[Cortex-Debug官方文档](https://github.com/Marus/cortex-debug)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值