mmap
例子c++記憶體寫壞問題,有很多原因造成,包括野指標、指標越界、併發場景等,出現很難排查,有很多記憶體分析工具可以使用,比如valgrind1
mprotect是一種系統呼叫,mprotect
簡單而言,mprotec可以指定一塊記憶體保護為指定的模式,比如唯讀模式,這樣當有場景破壞該模式的時候,就可以傳送訊號量sigse**,這時候程式中捕獲sigse**,就可以獲取到相關資訊
#include
int mprotect
(void
*addr, size_t len, int prot)
;
其中addr和len指定保護的記憶體區域,其中prot是模式,比如
prot_none the memory cannot be accessed at all.
prot_read the memory can be read.
prot_write the memory can be modified.
prot_exec the memory can be executed.
其中需要注意的一點,mprotect要求保護的addr需要記憶體位址頁對齊。因此如果保護的位址不是記憶體位址頁對齊,需要改造比如填充保證對齊,或者使用mmap分配記憶體,保證一定是對齊的
mmap是一種記憶體對映檔案的方法,即將乙個檔案或者其它物件對映到程序的位址空間,實現檔案磁碟位址和程序虛擬位址空間中一段虛擬位址的一一對映關係。具體可以參考認真分析mmap:是什麼 為什麼 怎麼用
void
*mmap
(void
*start, size_t length, int prot, int flags, int fd, off_t offset)
;
#include
#include
#include
#include
#include
#include
#include
#include
static int alloc_size;
static char* memory;
void
se**_handler
(int signal_number)
int main()
g++ main.cpp -o main
執行後,./main
./main
memory accessed!
free mem
應用 valgrind 發現 linux 程式的記憶體問題↩︎
寫壞C程式的幾大訣竅
寫壞c程式的幾大訣竅 如果你常常按照下面方式寫程式,可以保證你的程式經常出錯,你也經常頭疼。1 根本不管程式的格式,把程式寫得老師也看不懂 自己當然更看不懂 用格式迷惑自己也是弄壞程式的絕招。例如 if a 0 if x y else 請自己分析這到底是什麼意思。2 不關心scanf或者printf...
如何評價軟體寫的好還是壞?
軟體自身是一種固化的思維,因此從本質上來看,軟體是不可度量的。但這並不意味著軟體不需要度量,而只是說軟體中的度量大多都有一定限度。應用各種度量資料的時候一旦跨過這種限度,結果就會適得其反。對軟體 直觀可見的質量屬性 的度量比較簡單,比如 bug率,效能等,這裡就不提了。這裡主要關注的是軟體的內在的,...
如何排查JVM記憶體問題並定位
今天收到測試小姐姐提的bug,在進行壓測的時,記憶體和cpu都飆高,要我分析一下。使用jdk自帶的 jvisualvm.exe 功能 在jdk的bin目錄下 如果是記憶體洩漏,堆記憶體會一直往上飆,然後會出現瘋狂gc的情況。我這裡沒有出現瘋狂gc的情況,而是有規律的gc,但每次gc的時候cpu都會飆...