1. 程式人生 > >例項介紹利用valgrind定位記憶體非法訪問問題

例項介紹利用valgrind定位記憶體非法訪問問題

       本文繼續介紹 valgind的使用, 看程式:

#include <stdio.h>

int main()
{
    int a[100];
    a[10000] = 0;

    return 0;
}
       用valgrind分析:
[[email protected] ~/valgrind-3.8.1/bin]# ./valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./a.out
==27955== Memcheck, a memory error detector
==27955== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==27955== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==27955== Command: ./a.out
==27955== 
==27955== Invalid write of size 4
==27955==    at 0x40055F: main (test.cpp:6)
==27955==  Address 0x7ff009f90 is not stack'd, malloc'd or (recently) free'd
==27955== 
==27955== 
==27955== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==27955==  Access not within mapped region at address 0x7FF009F90
==27955==    at 0x40055F: main (test.cpp:6)
==27955==  If you believe this happened as a result of a stack
==27955==  overflow in your program's main thread (unlikely but
==27955==  possible), you can try to increase the size of the
==27955==  main thread stack using the --main-stacksize= flag.
==27955==  The main thread stack size used in this run was 8388608.
==27955== 
==27955== HEAP SUMMARY:
==27955==     in use at exit: 0 bytes in 0 blocks
==27955==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==27955== 
==27955== All heap blocks were freed -- no leaks are possible
==27955== 
==27955== For counts of detected and suppressed errors, rerun with: -v
==27955== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 6 from 6)
Segmentation fault
[
[email protected]
~/valgrind-3.8.1/bin]#
       可以看到,  第6行有記憶體非法訪問, 程式core dump了。 當然, 除了用valgrind, 我們還可以用其他方法來查出這個記憶體異常訪問導致的core dump問題, 之前介紹過很多次了, 故不再贅述。

       要注意的是, 如果寫成a[100] = 0; 實際發現, 並沒有core dump, 但這也是非常危險的操作, 應該避免。 至於是否真的core dump, 那就要看你的運氣了。 總之, 不要依賴於此類undefined behavior.

      類似的非法記憶體訪問還有:

#include <stdio.h>

int main()
{
    char *p;
    *p = 'a';

    return 0;
}
     valgrind分析結果如下:
[[email protected] ~/valgrind-3.8.1/bin]# g++ -g test.cpp
[[email protected] ~/valgrind-3.8.1/bin]# 
[[email protected] ~/valgrind-3.8.1/bin]# ./valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./a.out
==31774== Memcheck, a memory error detector
==31774== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==31774== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==31774== Command: ./a.out
==31774== 
==31774== Use of uninitialised value of size 8
==31774==    at 0x40055C: main (test.cpp:6)
==31774== 
==31774== Invalid write of size 1
==31774==    at 0x40055C: main (test.cpp:6)
==31774==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==31774== 
==31774== 
==31774== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==31774==  Access not within mapped region at address 0x0
==31774==    at 0x40055C: main (test.cpp:6)
==31774==  If you believe this happened as a result of a stack
==31774==  overflow in your program's main thread (unlikely but
==31774==  possible), you can try to increase the size of the
==31774==  main thread stack using the --main-stacksize= flag.
==31774==  The main thread stack size used in this run was 8388608.
==31774== 
==31774== HEAP SUMMARY:
==31774==     in use at exit: 0 bytes in 0 blocks
==31774==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==31774== 
==31774== All heap blocks were freed -- no leaks are possible
==31774== 
==31774== For counts of detected and suppressed errors, rerun with: -v
==31774== Use --track-origins=yes to see where uninitialised values come from
==31774== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 6 from 6)
Segmentation fault
[
[email protected]
~/valgrind-3.8.1/bin]#
 

      再比如:

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

int main()
{
    char *p = (char *)malloc(30);
    p[31] = 'a';

    return 0;
}

       valgrind分析結果如下:

[[email protected] ~/valgrind-3.8.1/bin]# ./valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./a.out
==32673== Memcheck, a memory error detector
==32673== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==32673== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==32673== Command: ./a.out
==32673== 
==32673== Invalid write of size 1
==32673==    at 0x4005C2: main (test.cpp:8)
==32673==  Address 0x5d8405f is 1 bytes after a block of size 30 alloc'd
==32673==    at 0x4C278FE: malloc (vg_replace_malloc.c:270)
==32673==    by 0x4005B5: main (test.cpp:7)
==32673== 
==32673== 
==32673== HEAP SUMMARY:
==32673==     in use at exit: 30 bytes in 1 blocks
==32673==   total heap usage: 1 allocs, 0 frees, 30 bytes allocated
==32673== 
==32673== 30 bytes in 1 blocks are definitely lost in loss record 1 of 1
==32673==    at 0x4C278FE: malloc (vg_replace_malloc.c:270)
==32673==    by 0x4005B5: main (test.cpp:7)
==32673== 
==32673== LEAK SUMMARY:
==32673==    definitely lost: 30 bytes in 1 blocks
==32673==    indirectly lost: 0 bytes in 0 blocks
==32673==      possibly lost: 0 bytes in 0 blocks
==32673==    still reachable: 0 bytes in 0 blocks
==32673==         suppressed: 0 bytes in 0 blocks
==32673== 
==32673== For counts of detected and suppressed errors, rerun with: -v
==32673== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 6 from 6)
[[email protected] ~/valgrind-3.8.1/bin]# 

      OK,  先說這麼多。





相關推薦

例項介紹利用valgrind定位記憶體非法訪問問題

       本文繼續介紹 valgind的使用, 看程式: #include <stdio.h> int main() { int a[100]; a[10000] = 0; return 0; }       用valgrind分

例項介紹利用valgrind定位記憶體洩漏問題

        在前面的文章中, 我們簡單瞭解了valgrind工具的用途以及安裝, 以便大家能進行實際操作。 在本文中, 我們通過例項來看看如何利用valgrind來定位記憶體洩漏問題。 先看程式: #include <stdio.h> #include &

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

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

利用工具定位記憶體洩漏問題 valgrind memwatch dmalloc

記憶體洩漏定位工具 記憶體debug有比較多的方法,首先可以參看如下的wiki,檢視大概都有哪些方式,再根據其有缺點選用,適合自己需要的方式。 Memory Debuggers https://elinux.org/Memory_Debuggers#mpatrol

【Linux開發】GCC 4.8及以上支援記憶體非法訪問檢查

gcc4.8及以上版本支援地址越界,野指標檢查,只需要在編譯時使用-fsanitize=address選項即可,當執行程式時如果訪問非本程式申請的地址就會報錯。[email protected]:/home/ngos/practice> vi nullpoi

Linux使用者態用訊號定位異常退出訪問非法記憶體問題

repost from:http://www.cjjjs.com/paper/xmkf/2017817141130842.html 很多使用者認為程序異常終止情況無從分析,但實際上程序異常終止情況都是有跡可尋的. 所有的程序異常終止行為,都是通過核心發訊號給特定程序或程序組

利用jstack定位典型效能問題例項

此文已由作者朱笑天授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。     問題的起因是筆者在一輪效能測試的中,發現某協議的響應時間很長,去觀察哨兵監控裡的javamethod監控可以看到以下結果:     onMessage是該協

利用linux的mtrace命令定位記憶體洩露(Memory Leak)

1、安裝mtrace工具 centos : sudo yum install glibc-utils 2、mtrace工具使用 /************************************************************************* >

Linux下利用Valgrind工具進行記憶體洩露檢測和效能分析

Valgrind通常用來成分析程式效能及程式中的記憶體洩露錯誤 一 Valgrind工具集簡紹 Valgrind包含下列工具:     1、memcheck:檢查程式中的記憶體問題,如洩漏、越界、非法指標等。     2、callgrind:檢測程式程式碼的執行

利用Arthas定位線上問題例項

前言 Arthas是一個類似於Btrace的JVM線上除錯分析工具,具體可參考我之前寫的一篇部落格:利用JVM線上除錯工具排查線上問題。本文分享筆者剛遇到的一個問題,雖然不復雜,但是很典型。 問題與分析過程 昨天上線遇到一個問題,交易後給大資料平臺非同步送數,但是他們說沒收到資料,因為我們沒有打日誌,所以沒有

利用絕對定位實現垂直居中

子div bottom absolute cnblogs lac class pan abs 原理 <div style="width: 200px;height: 200px;background: gray;position: relative">

非法訪問空指針問題

images () span 之前 listnode ext png mes ptr #include<iostream> using namespace std; struct listNode { int data; listNode *

iOS 【UIKit-UIPageControl利用delegate定位圓點位置 之 四舍五入小技巧】

優化 距離 scroll current control 水平 技術 觸發 src 在UIScrollView中會加入UIPageControl作為頁碼標識,能夠讓用戶清楚的知道當前的頁數。我們須要優化的一點是讓pageControl

請教利用fegin進行遠程訪問設置Hystrix熔斷器不生效

size 控制 fin png schema work www sha fall 本人的環境:1.基於spring boot 2.0.4的 spring cloud(Finchley.SR1)2.分為eureka,merber,order。order通過Fegin的方式調用

例項介紹MyBatis增刪改查基本操作

通過上一篇部落格《MyBatis的入門介紹》我們瞭解了MyBatis基本原理 這篇我們就說說它的增刪改查基本操作 例項應用 建立Java Product專案,目錄結構如下: 資料庫結構如下 conf.xml檔案內容 <?xml version=

利用hbase api在本地訪問並操作伺服器的hbase資料庫

最近因為實驗室專案需要,開始研究了hbase。然後想一次性往叢集伺服器上寫入大量的資料,並存到hbase中,考慮到在hbase shell下只能單個數據put,這樣對於批量插入資料的要求完全不合適。於是就研究起hbase的java api,然後去大量填充資料到hbase以測試查詢的效能。於是,故事開

selinux配置錯誤例項介紹

錯誤原因 配置關閉SELinux,結果誤操作 應修改配置檔案/etc/selinux/config中的“SELINUX”引數的值, # SELINUX=enforcing  原始配置 SELINUX=disabled    正確 但是誤將“SELINUXTYPE”看成

裝置I/O埠和I/O記憶體訪問

裝置通常會提供一組暫存器來控制裝置、讀寫裝置和獲取裝置狀態,即控制暫存器、資料暫存器和狀態暫存器。 這些寄器可能位於I/O空間中,也可能位於記憶體空間中。當位於I/O空間時,通常被稱為I/O埠;當位於記憶體空間時,對應的記憶體空間被稱為I/O記憶體。 每個外設都是通過讀寫其暫存器來控制的

利用MapFile定位程式崩潰(報紅牌)時的程式碼位置

原文:http://www.codeproject.com/KB/debug/mapfile.aspx 1、生成MapFile Project—Setting—C+±—DebugInfo,選擇Line Numbers Only Project—Setting—Link—選擇Generat

防止非法訪問

什麼時候會用到防止非法訪問呢? 正常的我們應該訪問HTML檔案,但有些人會直接訪問PHP檔案,如果直接訪問PHP檔案會出現錯誤,所以我們要防止直接訪問PHP檔案。 如何防止直接來訪問呢? 我們需要先判斷使用者輸入的是否為空陣列 1.empty(檢查一個變數是否為空) bool e