vxworks memory overflow debug

2024-04-09 02:58
文章标签 debug memory overflow vxworks

本文主要是介绍vxworks memory overflow debug,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

现象vxworks 日志中出现如下打印:

A:tmd_check  curr_buff 0x2d26ee50 len 14224 extra 0x0 {stack.c:667}

A:tmd_check      0xdeadbeef app 0x2e89e660 {stack.c:641}

A:tmd_check   {stack.c:651}

A:tmd_check  OVERWRITTEN buffer {stack.c:661}

表明内存被改写

1.lkAddr 0x2d26ee50 查看地址附近的内存结构,可知道是数据段内存(存放初始化的全局变量),且靠近gifa_pbLaserExpPwr全局变量

% lkAddr 0x2d26ee50
0x2d26db60 gOACurrentState           abs
0x2d26ee60 gifa_pbLaserExpPwr        data
0x2d26ee68 gRecord_TP_Info           data
0x2d26ee6c gIfaLogModuleInfo         data
0x2d27038c gIfaDbgInfo               data
0x2d2725f0 neConfigTable.0           bss      (local)
0x2d272610 neConfigTable.1           bss      (local)
0x2d272630 timeDefects.2             bss      (local)
0x2d272638 portDefects.3             bss      (local)
0x2d272684 autuDefects.4             bss      (local)
0x2d2726a0 timeDefects.5             bss      (local)
0x2d2726a8 neConfigTable.6           bss      (local)
value = 0 = 0x0

2.打印该越界地址内存

% d 0x  0x2d26ee50
2d26ee50:  2d27 25e0 2d26 db50 0000 1bc8 0000 0000   *-'%.-&.P........*
2d26ee60:  0000 0000 0000 0000 0000 0001 0000 0000   *................*
2d26ee70:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26ee80:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26ee90:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26eea0:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26eeb0:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26eec0:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26eed0:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26eee0:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26eef0:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26ef00:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26ef10:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26ef20:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26ef30:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d26ef40:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
value = 21 = 0x15

2d27 25e0:后一块内存块的首地址
2d26 db5:前一块内存块的首地址
0000 1bc8:内存块总长度(0x1bc8 *2= 14224字节)
00头结构中的free字节,取值为下面三种,已被破坏。

#define BUFFER_USED         0xE8  // wierd numbers to decreaselikelyhood of hitting on accident

#define BUFFER_CACHE        0x7E

#define BUFFER_FREE         0xC6



3.查看尾部调试信息

lptr  = (unsigned int *)((char *)hdr + 2*hdr->nWords - hdr->extra * 4 - 8);
lptr = 0x2d26ee50 +0x3790 -0 -8 = 0x2d2725d8


0x2d2725d8 -----------content
2d2725d0:                      dead beef 2e89 e660   *          .....`*
2d2725e0:  2d4b c060 2d26 ee50 0012 4d40 e800 0000   *-K.`-&.P..M@....*
2d2725f0:  0100 0000 0000 0000 0000 0000 0000 0000   *................*
2d272600:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d272610:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
2d272620:  0000 0000 0000 0000 0000 0000 0000 0000   *................*
 
dead beef 溢出检测标志 
2e89 e660 调试信息(appid)
% ti 0x2e89e660 查看出其任务ID(所属任务为 TM_daemon(所有任务的main_task) 所属内存----无意义,只是说明全局变量(全部由它代为创建内存)
% ti 0x2e89e660NAME        ENTRY       TID    PRI   STATUS      PC       SP     ERRNO  DELAY
---------- ------------ -------- --- ---------- -------- -------- ------- -----
TM_daemon  5c7f8        2e89e660 179 PEND+T       2ac978 2e89e338  3d0004  2586stack: base 0x2e89e660  end 0x2e89abc0  size 14992  high 4736   margin 10256options: 0xc
VX_DEALLOC_STACK    VX_FP_TASK          VxWorks Events
--------------
Events Pended on    : Not Pended
Received Events     : 0x0
Options             : N/Ar0     =    71728   sp     = 2e89e338   r2     =        0   r3     =        0
r4     =     1770   r5     = 2e89e660   r6     =  2029230   r7     =       b3
r8     =  12958dc   r9     =        4   r10    = 2e89e660   r11    =        8
r12    =   2ac7fc   r13    =        0   r14    =        0   r15    =   420000
r16    =    30000   r17

4.打硬件断点
bh 0x2d26ee50, 0x3, 0, 0, 0

挂起了相应任务导致crash,可以判断出是ifa 任务导致crash.

Ifa_init函数

828           ifx_saveEndTime_moveToNext(&gIfaHandleMsgData);

出问题时的堆栈

task 0x7f95980 ifa stack

  [0]0x2d1cb9f0 IfaEpgSllHead+0

  [1]0x27e7e58 Ifa_Init+1448

  [2]0x5f7bc tmd_TaskEnd+992

  [3] 0x3fe09c vxTaskEntry+84                                      

  [4]0x0 (UNKNOWN)+0

5.重新打断点并查看相应任务状态,表明是ifa 进行写内存操作。

% i ifa

NAME        ENTRY       TID    PRI   STATUS      PC       SP     ERRNO  DELAY
-
--------- ------------ -------- --- ---------- -------- -------- ------- -----
ifa        5f62c         7f95980 228 SUSPEND     27ec3ec  7f937a8  3d0002     0

6.由于第1步就得到相应的符号表,检查相关代码,最后得到 gifa_pbLaserExpPwr 下标取值可能有-1情况。

int gifa_pbLaserExpPwr[2];

/* ***********code **************/

gifa_pbLaserExpPwr [uiFuncPortNo-1]=pPortCfg->sPortCfg.pbLaserExpPwr;

/* ***********code **************/

7.修复后问题正常内存打印

% d 0x2d26ee502d26ee50:  2d27 25e0 2d26 db50 0000 1bc8 e800 0000   *-'%.-&.P........*
2d26ee60:  ffff ffce 0000 0000 0000 0001 4946 4100   *............IFA.*2d26ee70:  0000 0000 0000 0000 0000 0000 0000 0000   *................*2d26ee80:  0000 0000 0000 0000 0000 0000 4552 524f   *............ERRO*2d26ee90:  5200 0000 0000 0000 0000 0000 0000 0000   *R...............*2d26eea0:  0000 0000 0000 0000 0000 0000 0000 0003   *................*2d26eeb0:  00c8 4572 726f 7220 696e 666f 2e00 0000   *..Error info....*
2d26eec0:  0000 0000 0000 0000 0000 0000 0000 0000   *................*2d26eed0:  0000 0000 0000 0000 0000 0000 0000 0000   *................*2d26eee0:  0000 0000 0000 0000 0000 0000 0000 0000   *................*2d26eef0:  0000 0000 0000 0000 0000 0000 0000 0000   *................*2d26ef00:  0000 0000 0000 0000 0000 0000 0000 0000   *................*2d26ef10:  0000 0000 0000 0000 0000 0000 0000 0000   *................*2d26ef20:  0000 0000 0000 0000 0000 0000 0000 0000   *................*2d26ef30:  0000 0000 4d53 4700 0000 0000 0000 0000   *....MSG.........*2d26ef40:  0000 0000 0000 0000 0000 0000 0000 0000   *................*value = 21 = 0x15
e800 0000 被改写过。
全局变量由tm_task 统一分配(编译时已经指定),1块内存可能包含多个全局变量。

相关知识

-> bh   address, access, task, count, quiet
access: 0 - instruction,
1 - read/write data,
2 - read data,
3 - write data

内存块的基本结构如下:





Big Endian

0x12345678   低地址                                            高地址   ----------------------------------------->   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   |     12     |      34    |     56      |     78    |   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+



这篇关于vxworks memory overflow debug的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/887025

相关文章

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

Java服务实现开启Debug远程调试

《Java服务实现开启Debug远程调试》文章介绍如何通过JVM参数开启Java服务远程调试,便于在线上排查问题,在IDEA中配置客户端连接,实现无需频繁部署的调试,提升效率... 目录一、背景二、相关图示说明三、具体操作步骤1、服务端配置2、客户端配置总结一、背景日常项目中,通常我们的代码都是部署到远程

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 (debug笔记)

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 ##一、 缘由及解决方法 把这个pytorch-ddpg|github搬到jupyter notebook上运行时,出现错误Nn criterions don’t compute the gradient w.r.t. targets error。注:我用

idea 怎么调试debug

1、这里以一个web工程为例,点击图中按钮开始运行web工程。 2、设置断点 3、使用postman发送http请求 4、请求发送之后会自动跳到断点处,并且在断点之前会有数据结果显示 5、按F8 在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则不进入当前方法体内,跳到下一条执行语句。 6、按F7在 Debug 模式下,进入下一步,如果当

02 Shell Script注释和debug

Shell Script注释和debug 一、ShellScript注释 ​ # 代表不解释不执行 ​ 语法:# # 创建myshell.sh文件[root@localhost ~]# vi myshell.sh # 写入内容#!/bin/bash# 打印hello world(正确)echo "hello world"echo "hello 2" # 注释2(正确)echo

Tomcat怎样用Debug模式启动

在加装了Tomcat插件的Eclipse中可以设置用Debug模式启动Tomcat,此时Tomcat以及Web应用中的日志都以最详细的级别输出。 但如果直接从命令行用“starup.sh”启动,则只有INFO和更高级别的日志被输出,其他的都过滤掉了。 怎样才能在命令行里以Debug模式启动Tomcat?         你可以用配置Tomcat支持

WebStorm用Debug模式调试Vue等前端项目

问题说明 开发前端时,一直很苦恼调试前端代码的麻烦。 简单的内容可以通过console.log()在控制台打印变量值,来验证预期结果。 涉及到稍复杂的逻辑,就需要在代码中侵入增加debugger,或者在浏览器中找到js文件,再手动添加断点。 非常的麻烦,而且浏览器中对变量的追踪功能也有限,同时我也一直好奇WebStorm中Debug启动方式的作用,今天研究了一下,果然WebStorm提供了更简

The `XXXUITests [Debug]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build......

出现的警告: [!] The `ColorInHeartUITests [Debug]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `Pods/Target Support Files/Pods-ColorInHeart-ColorInHeartUITests/Po