DSP开发中遇到的问题 - 类指针未初始化后果

收到RECEIVE_REQ_MSG消息时会执行下面的代码,这里因为某种原因m_receiverSlaverController的值仍为NULL,并没有指向具体的CReceiverSlaverController类。执行到ReceiveHandler函数时,在ReceiveHandler函数中,会通过CReceiverSlaverController类的成员变量m_measurementAgent(类型为Agent类)调用Agent类的成员函数handleMessage,然后在ReceiveHandler函数中发生了访问非法内存0xE8A4的异常。

这是因为:在执行m_receiverSlaverController->ReceiveHandler时,虽然m_receiverSlaverController指针的值为NULL,但由于类的成员函数是所有类对象的共享代码,所以通过空指针m_receiverSlaverController是可以调用ReceiveHandler函数的(经查看汇编代码,调用该函数时,地址是写死的),但在执行到ReceiveHandler内部的代码时出现了问题,这是因为在ReceiveHandler函数中,获取类CReceiverSlaverController的成员变量m_measurementAgent地址的办法是从m_receiverSlaverController处(实际上就是类第一个成员变量m_srioInterface所在地址处)偏移0xE8A4得到,因为m_receiverSlaverController为空,所以计算得到的m_measurementAgent地址就是0xE8A4,所以从地址0xE8A4处读取m_measurementAgent的值会出问题,这涉及了读取非法内存0xE8A4的操作,所以TI
DSP CPU的L1D内存控制器会检测到该非法访问,并通过EXCEPTION机制上报该错误。

case RECEIVE_REQ_MSG:

{

m_receiverSlaverController->ReceiveHandler(&messagePointer);

//m_receiverSlaverController为类CReceiverSlaverController指针

break;

}

... ....

void CReceiverSlaverController::ReceiveHandler(void** ninja_message)

{

m_measurementAgent->handleMessage(ninja_message);

}

类CReceiverSlaverController:

class CPuschReceiverSlaverController

{

public:

......................

void      ReceiveHandler(void** ninja_message);

......................

private:

void        *m_srioInterface;

......................

Agent    *m_measurementAgent; //该成员变量相对于类第一个成员变量m_srioInterface的偏移为0xE8A4. Agent为类的类型.

......................

}

非法内存读的上报log:

FATAL EXCEPTION Nid:0x1271 TYPE:EXTERNAL:[0xEA07A]CpuL1DMemoryProtectionFault Violated memory address(L1DMPFAR):0x0000E8A4Local access type:supervisor read
**

021817 17.06 17:47:03.421  [192.168.255.1]  ** FATAL APPLICATION ERROR Nid:0x1271 Total count of exceptions INT:0 EXT:1 OTHER:0 Current program address(NRP):0x820F4024 (该地址是进入EXCEPTION代码之前保存的返回地址,该地址就是handleMessage函数某条指令的地址)**

DSP开发中遇到的问题 - 类指针未初始化后果

时间: 2024-10-07 06:38:25

DSP开发中遇到的问题 - 类指针未初始化后果的相关文章

android开发中关于继承activity类中方法的调用

android开发中关于继承activity类中的函数,不能在其他类中调用其方法. MainActivity.java package com.example.testmain; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState)

Filter组件开发中的SDK基类分析

DirectShow SDK提供了一套开发Filter的基类源代码.基于这些基类开发Filter将大大简化开发过程. 1.CBaseObject 大部分SDK类都从CBaseObject类(参见combase.h)中继承而来的. [cpp] view plaincopy class CBaseObject { private: // Disable the copy constructor and assignment by default so you will get //   compil

JAVA开发中常用的工具类

====ToStringBuilder==== 项目中一般都需要打印日志,所有实体的toString()方法都是用简单的"+",因为每"+" 一个就会 new 一个 String 对象,这样如果系统内存小的话会暴内存.使用ToStringBuilder就可以避免暴内存这种问题. ToStringBuilder的reflectionToString方法: logger.info("请求数据:"+ToStringBuilder.reflectionT

Android开发中常用的工具类整理

来源 http://wujingchao.net/2015/03/16/android_common_utility_class.html 日志 package net.wujingchao.android.utility import android.util.Log; public final class L { private final static int LEVEL = 5; private final static String DEFAULT_TAG = "L"; pr

Web开发中Listener、Filter、Servlet的初始化及调用

我们在使用Spring+SpringMVC开发项目中,web.xml中一般的配置如下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLoca

java中的集合操作类(未完待续)

申明: 实习生的肤浅理解,如发现有错误之处,还望大牛们多多指点 废话 其实我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList<XXXXX>(); 但是我仅仅只是了解,list这个类是一个可变长用来存储的对象实例的类,我甚至觉得这个List对象可以理解成数组,但是却又与java中咱们正常理解的数组很多的不同,比如说,他的长度可以随着需要自动增长,比如说,实例化一个List类就和咱们声明数组的时候是不一样的! 今天的实习生活

C++中指针未初始化的问题

源代码: IntList::IntList(int numVals , int val ) { if (numVals>0){ numberValues=numVals; values=new int[numVals]; for(int i=0;i<numVals;++i){ values[i]=val; } } else numberValues=0; } IntList::IntList(const IntList &il) { numberValues=il.size(); if

面向对象--多继承&amp;派生类对象内存布局分析&amp;各基类指针所指向的位置分析

背景 原文链接:ordeder  http://blog.csdn.net/ordeder/article/details/25477363 关于非虚函数的成员函数的调用机制,可以参考: http://blog.csdn.net/yuanyirui/article/details/4594805 成员函数的调用涉及到面向对象语言的反射机制. 虚函数表机制可以查看下面这个blog: http://blog.csdn.net/haoel/article/details/1948051 总结为: 其一

iOS开发中的内存分配与分区

iOS开发中的内存分配与分区 关于RAM&ROM RAM与ROM就是具体的存储空间,统称为存储器. RAM(random access memory):运行内存,CPU可以直接访问,读写速度非常快,但是不能掉电存储.它又分为: 动态DRAM,速度慢一点,需要定期的刷新(充电),我们常说的内存条就是指它,价格会稍低一点,手机中的运行内存也是指它. 静态SRAM,速度快,我们常说的一级缓存,二级缓存就是指它,当然价格高一点. ROM(read only memory):存储性内存,可以掉电存储,例如