4. 使用Wind River Workbench调试

任务目标

在Wind River Workbench中连接VxWorks目标机,通过设置断点、单步执行和变量监视,完成一个用户态应用的在线调试闭环。本案例以一个计算数组元素平方和的简单任务为载体,演示Workbench调试器的核心操作流程。

环境与前置条件

  • 已安装Wind River Workbench(含VxWorks 7或6.9目标机镜像)
  • 目标机已启动并运行VxWorks,通过网络与主机连通
  • 已创建可下载内核模块(DKM)类型的应用工程,编译通过

示例代码

创建文件 debug_demo.c,代码如下:

```c #include #include /* 全局变量,便于在调试器中观察 */ int g_result = 0; /* 计算数组元素的平方和 */ static int square_sum(int *arr, int len) { int i; int sum = 0; for (i = 0; i < len; i++) { sum += arr[i] * arr[i]; /* 第8行:在此处设置断点 */ g_result = sum; /* 第10行:观察g_result变化 */ } return sum; } /* 调试入口函数 */ void debug_demo(void) { int data[5] = {1, 2, 3, 4, 5}; int total; total = square_sum(data, 5); /* 第19行:单步进入函数 */ printf("sum of squares = %d\n", total); } ```

调试操作步骤

  1. 启动调试会话:在Workbench中右键点击DKM工程 → Debug As → VxWorks DKM Application。选择目标机连接后,应用被下载到目标机内存并停在入口处。
  2. 设置断点:在debug_demo.c第8行(sum += arr[i] * arr[i])左侧双击设置断点,断点标记变为实心圆。
  3. 运行到断点:点击Resume(F8),程序运行至第8行暂停。此时i=0,sum=0。
  4. 单步执行:点击Step Over(F6)执行当前行,sum变为1(即1*1)。再点击Step Into(F5)可进入被调函数(本例中无其他函数调用,效果同Step Over)。
  5. 观察变量:在Variables视图中展开arr可查看5个元素;右键sum选择Add Watch将其加入Expressions视图,持续跟踪其变化。全局变量g_result可在Expressions视图中手动添加。
  6. 继续执行:再次点击Resume,程序在第8行第二次暂停(i=1)。观察sum变为5(1+4)。重复Resume直至循环结束。
  7. 结束调试:点击Resume让程序运行完printf,在目标机控制台看到输出sum of squares = 55。点击Terminate结束会话。

验证方法

  • 断点命中:每次点击Resume后,调试器在第8行暂停,且i值依次为0、1、2、3、4,共命中5次。
  • 变量值正确:单步执行后sum值依次为1、5、14、30、55,与平方和累加逻辑一致。
  • 最终输出:目标机控制台打印sum of squares = 55,与代码逻辑直接对应。

常见问题

  • 断点无法命中:确认编译时未开启优化(-O0),且下载的是Debug版本镜像。
  • 变量显示“out of scope”:局部变量sum仅在square_sum函数内有效,需在断点命中时查看。
  • 连接超时:检查目标机IP与Workbench中配置的Target Server是否一致,使用ping验证网络连通。
Workbench调试流程与变量变化 执行流程 调用 debug_demo() 进入 square_sum() 断点:sum += arr[i]² 单步执行 / 观察变量 循环结束,返回 55 Variables / Expressions 视图 断点次数 i sum g_result 第1次 0 0 0 第2次 1 1 1 第3次 2 5 5 第4次 3 14 14 第5次 4 30 30 最终输出:sum of squares = 55