1. 程式人生 > >keil利用Breakpoints追蹤記憶體值異常修改分析說明

keil利用Breakpoints追蹤記憶體值異常修改分析說明

在開發過程中,經常會遇到記憶體值被異常篡改的情況。而且,篡改者往往並不是你當前所正在進行除錯的部分(即記憶體異常篡改其實早就存在,只不過現在才凸顯出來),這樣問題很難跟蹤,故利用keil的這一特性,追蹤問題。

以下專案舉例說明

1. 用電裝置,A相電壓偏差極值顯示63.25%,而此時額定電壓為220v,A相單相上電,偏差值不應
   有這麼大偏差值計算公式為:

    ΔU = ((U - Un) / Un) * 100%;

    式中:△U--電壓偏差百分比;U一實際電壓:Un電網標稱電壓。

2. 觀察ac_data_memory中相應資料顯示確實為這麼大,考慮資料除錯過程中異常,故對到下一
   日,對時後,資料變為0,1分鐘後變為60+%(其實是有做統計資料,但此時並未往這方面想)。

3. 經過2的分析後,確定一定是有某個地方對這塊記憶體操作了,故使用推薦方法跟蹤是哪個地方在
   操作記憶體。

4. 檢視記憶體地址:

記憶體地址

5. 新增此記憶體地址(0x20017B27)到Breakpoints,Debug->Breakpoints,如:

breakpoints

6. 新增步驟如下圖:

新增步驟

7. 全速執行,當訪問者修改這片記憶體時,程式會中斷,這時斷點的位置就時訪問者。如:

全速執行結果

8. 問題定位。

注意事項

使用中並不能100%命中,不能過分依賴。

相關推薦

keil利用Breakpoints追蹤記憶體異常修改分析說明

在開發過程中,經常會遇到記憶體值被異常篡改的情況。而且,篡改者往往並不是你當前所正在進行除錯的部分(即記憶體異常篡改其實早就存在,只不過現在才凸顯出來),這樣問題很難跟蹤,故利用keil的這一特性,追蹤問題。 以下專案舉例說明 1. 用電裝置,A相電壓偏

Android應用程式的預設最大記憶體以及修改

Android應用程式的預設最大記憶體值為16M,不同的手機版本和型號有所不同. 有些應用程式可能會出現記憶體溢位,譬如: ERROR/AndroidRuntime(264): java.lang.OutOfMemoryError: bitmap size ex

例項介紹利用valgrind定位記憶體異常釋放問題(double free 和wrong free)

         之前介紹過利用valgrind來定位記憶體洩漏(慢性病, 會導致程式在某個不確定的時刻異常), 本文我們來簡要介紹利用valgrind來定位記憶體的重複釋放(急性病, 會報紙程式崩潰)。 看程式: #include <stdio.h> #inc

利用python監控文件被修改

python 監控目錄需求:利用python編寫監控程序,監控一個文件目錄,當目錄下的文件發生改變時,實現有修改就發報警郵件郵件使用QQ郵箱,需要開啟smtp,使用手機發生短信,騰訊會給你發郵箱密碼。如下所示:把這個密碼填到程序中。python版本[[email protected]/* */ d

添加json屬性並賦修改json屬性(ztree樹形結構)

items length [] box poi 修改 item sub amp var data=[ {accounts :[], attrs : {maxmailboxsize: "-1", maxusers: "-1"}, fullpa

微信端瀏覽器title修改

由於 bsp 一個 load col 事件 nbsp timeout chang 若是PC端網頁:(jquery方式) 獲取title值:   $(document).attr(“title”);   $(“title”).html(); 修改title值:   $

Linux下利用backtrace追蹤函數調用堆棧以及定位段錯誤[轉]

調試 寫入文件 如果 通過 來源 res c函數 glibc tac 來源:Linux社區 作者:astrotycoon 一般察看函數運行時堆棧的方法是使用GDB(bt命令)之類的外部調試器,但是,有些時候為了分析程序的BUG,(主要針對長時間運行程序的分析),在程序

Odoo中的逆計算——由compute字段的逆向修改其依賴

duration entry str blank targe 就是 獲取 second 時間 轉載請註明原文地址:https://www.cnblogs.com/cnodoo/p/9281406.html 當通過compute屬性指定方法,根據依賴值計算得到當

python 字典巢狀字典賦異常

針對dict中 巢狀dict 出現複製異常 lists={} test=['s1','s2','s3'] data = {'value': '',} for i in range(2): lists[i]=data # dic = {0: {'value': '',}, 1:{'value':

JPA查詢資料後,修改其中的某個,導致資料庫的修改了(JPA的生命週期)

問題描述 在一個迴圈中,通過JPA進行查詢後,修改查詢後的值,導致資料庫的值修改了 for (Integer integer : condition.getResourceIds()) { List<Integer> te

利用opencv對圖片大小進行修改

執行環境:ubuntu16.04 + opencv 2.4.13 + c++ (系統g++版本5.4.0) #include <iostream> #include <fstream> #include <opencv2/core/core.hpp> #inc

學習筆記1:深入理解Java虛擬機器——JVM高階特性與最佳實踐_走進java_java記憶體區域與記憶體溢位異常

第一部分:走進java Java虛擬機器 程式碼在華章下載 jdk釋出了六個命令列工具和兩個視覺化故障處理工具。 推薦書籍 設計原本 領域特定語言 現在著名的Java虛擬機器 hotspot vm(預設) jrockit vm j9 vm jdk sun jdk op

JVM學習--各資料區記憶體溢位異常測試

JVM學習–總索引 文章目錄 JVM學習--各資料區記憶體溢位異常測試 基本引數介紹 堆記憶體異常測試 OutOfMemoryError 棧記憶體異常 StackOverflowError 棧記憶體異常測試 OutOfMe

java虛擬機器—-java記憶體區域與記憶體溢位異常

一,java虛擬機器所管理的執行時資料區域分為:程式計數器、java虛擬機器棧、本地方法棧、java堆、方法區、執行時常量池。                     1,程式計數器:

《深入理解Java虛擬機器—JVM高階特性與實踐 周志 著》之第2章 Java記憶體區域與記憶體溢位異常

1、Java虛擬機器所管理的記憶體包括以下幾個執行時資料區域: 2、程式計數器:          1. 可以看作是當前執行緒所執行的位元組碼的行號指示器,是一塊較小的記憶體空間;  &nbs

python裡對字典的key進行修改的方法

參考瞭如下網站的方法,自己簡單改寫了對應函式。 https://stackoverflow.com/questions/21201661/key-must-not-contain-error-in-pymongo 修改字典的key,最好的方式就是新增一個key-value,value為之前的值;

【python學習筆記】42:Pandas資料缺失/異常/重複處理

學習《Python3爬蟲、資料清洗與視覺化實戰》時自己的一些實踐。 缺失值處理 Pandas資料物件中的缺失值表示為NaN。 import pandas as pd # 讀取杭州天氣檔案 df = pd.read_csv("E:/Data/practice/hz_we

JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 虛擬機器物件

本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 虛擬機器物件 Java物件的建立 1、類載入過程

JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 執行時資料區域

本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 執行時資料區域 概述 執行時資料區域 程式計數器 Java虛擬機

【夾娃系列】java面試基礎知識儲備(¥2)——JVM記憶體劃分和記憶體溢位異常的原因和解決方法

JVM記憶體劃分和記憶體溢位 JVM記憶體劃分 記憶體溢位的異常和解決辦法 JVM記憶體劃分 堆:存放物件例項,被所有的執行緒共享的一塊區域。垃圾收集器管理的主要區域。 方法區:儲存虛擬機器載入的類資訊,常量,靜態變