例項介紹利用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