1. 程式人生 > >linux核心記憶體問題檢測除錯

linux核心記憶體問題檢測除錯

記憶體檢測:
編譯slabinfo,對應在核心原始碼tools/vm下

/*
 * Slabinfo: Tool to get reports about slabs
 *
 * (C) 2007 sgi, Christoph Lameter
 * (C) 2011 Linux Foundation, Christoph Lameter
 *
 * Compile with:
 *
 * gcc -o slabinfo slabinfo.c
 */

gcc -o slabinfo slabinfo.c
這裡用交叉工具鏈編譯

 aarch64-linux-gnu-gcc -static slabinfo.
c -o slabinfo 要加-static編譯成靜態生成slabinfo推送到測試機linux中

用此工具要在核心commandline中新增slub_debug=PZ引數
確保

:/ # cat /proc/cmdline                                                     
rootfstype=ramfs init=/init console=ttyS0,115200 no_console_suspend slub_debug=PZ ea

訪問已經釋放的記憶體
重複釋放已釋放的記憶體
越界訪問

在核心開啟如下配置

開啟核心選項:
CONFIG_SLUB_DEBUG_ON
CONFIG_SLUB_DEBUG
CONFIG_SLUB_STATS
CONFIG_SLUB

如下例子
重複釋放已釋放的記憶體

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>

static char* buf;

static void create_slue_err(void){
    buf = kmalloc(32,GFP_KERNEL);
    if
(buf) { memset(buf,0x00,32); kfree(buf); printk("%s\n","free buf" ); kfree(buf);//重複釋放記憶體 } return; } static int __init my_test_init(void) { printk("init %s\n", "my_test_init 1"); create_slue_err(); printk("init %s\n", "my_test_init 2"); return 0; } static void __exit my_test_exit(void) { printk("%s\n","my_test_exit" ); return ; } MODULE_LICENSE("GPL"); module_init(my_test_init); module_exit(my_test_exit);
nsmod  /storage/DEBC3331BC330395/slub_test.ko                                 <
[ 9592.583607@3] init my_test_init 1
[ 9592.583639@3] free buf
[ 9592.583654@3] =============================================================================
[ [email protected]] BUG kmalloc-64 (Tainted: G           O): Object already free
[ 9592.598722@3] -----------------------------------------------------------------------------
[ 9592.598722@3] 
[ 9592.608641@3] Disabling lock debugging due to kernel taint
[ [email protected]] INFO: Allocated in $x+0x3c/0x8c [slub_test] age=3 cpu=3 pid=10621
[ 9592.621328@3]        alloc_debug_processing+0x194/0x1a0
[ 9592.625979@3]        __slab_alloc.isra.60.constprop.68+0x314/0x354
[ 9592.631585@3]        kmem_cache_alloc_trace+0x188/0x1bc
[ 9592.636243@3]        $x+0x38/0x8c [slub_test]
[ 9592.640039@3]        do_one_initcall+0xd4/0x138
[ 9592.644007@3]        load_module+0x1420/0x1dbc
[ 9592.647886@3]        SyS_finit_module+0x80/0x90
[ 9592.651854@3]        cpu_switch_to+0x48/0x4c
[ [email protected]] INFO: Freed in $x+0x50/0x8c [slub_test] age=7 cpu=3 pid=10621
[ 9592.662463@3]        free_debug_processing+0x1f4/0x310
[ 9592.667033@3]        __slab_free+0x268/0x3a8
[ 9592.670741@3]        kfree+0x200/0x238
[ 9592.673934@3]        $x+0x4c/0x8c [slub_test]
[ 9592.677728@3]        do_one_initcall+0xd4/0x138
[ 9592.681696@3]        load_module+0x1420/0x1dbc
[ 9592.685578@3]        SyS_finit_module+0x80/0x90
[ 9592.689544@3]        cpu_switch_to+0x48/0x4c
[ [email protected]] INFO: Slab 0xffffff8040d4bb30 objects=18 used=14 fp=0xffffffc0267f28c0 flags=0x4081
[ [email protected]] INFO: Object 0xffffffc0267f28c0 @offset=2240 fp=0xffffffc0267f3180
[ 9592.702050@3] 
[ [email protected]] Bytes b4 ffffffc0267f28b0: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ZZZZZZZZZZZZZZZZ
[ [email protected]] Object ffffffc0267f28c0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
[ [email protected]] Object ffffffc0267f28d0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
[ [email protected]] Object ffffffc0267f28e0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
[ [email protected]] Object ffffffc0267f28f0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b a5  kkkkkkkkkkkkkkk.
[ [email protected]] Redzone ffffffc0267f2900: bb bb bb bb bb bb bb bb                          ........
[ [email protected]] Padding ffffffc0267f2a40: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ZZZZZZZZZZZZZZZZ
[ [email protected]] Padding ffffffc0267f2a50: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ZZZZZZZZZZZZZZZZ
[ [email protected]] Padding ffffffc0267f2a60: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ZZZZZZZZZZZZZZZZ
[ [email protected]] Padding ffffffc0267f2a70: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ZZZZZZZZZZZZZZZZ
[ [email protected]] CPU: 3 PID: 10621 Comm: insmod Tainted: G    B      O 3.14.29 #3
[ [email protected]] Call trace:
[ 9592.814695@3] [<ffffffc001089390>] dump_backtrace+0x0/0x144
[ 9592.820214@3] [<ffffffc0010894f0>] show_stack+0x1c/0x28
[ 9592.825391@3] [<ffffffc001b1d294>] dump_stack+0x74/0xb8
[ 9592.830564@3] [<ffffffc0011b1a34>] print_trailer+0x148/0x1d0
[ 9592.836170@3] [<ffffffc0011b334c>] free_debug_processing+0x2a0/0x310
[ 9592.842466@3] [<ffffffc0011b5144>] __slab_free+0x268/0x3a8
[ 9592.847899@3] [<ffffffc0011b5710>] kfree+0x200/0x238
[ 9592.852817@3] [<ffffffbffc058068>] $x+0x68/0x8c [slub_test]
[ 9592.858336@3] [<ffffffc0010816a4>] do_one_initcall+0xd4/0x138
[ 9592.864029@3] [<ffffffc00111baec>] load_module+0x1420/0x1dbc
[ 9592.869635@3] [<ffffffc00111c600>] SyS_finit_module+0x80/0x90
[ [email protected]] FIX kmalloc-64: Object at 0xffffffc0267f28c0 not freed
[ 9592.881720@3] init my_test_init 2

越界訪問

static void create_slue_err(void){
    buf = kmalloc(32,GFP_KERNEL);
    if(buf)  {
        memset(buf,0x00,100);
        kfree(buf);
/*      printk("%s\n","free buf" );
        kfree(buf);*/
    }

    return;
}
 insmod /storage/DEBC3331BC330395/slub_test_access_free_point1.ko      
[  383.873867@3] init my_test_init 1
[  383.873899@3] init my_test_init 2
p212:/ # slabinfo -v                                                           
[  388.548241@3] =============================================================================
[  [email protected]] BUG kmalloc-64 (Tainted: G    B      O): Redzone overwritten
[  388.557746@3] -----------------------------------------------------------------------------
[  388.557746@3] 
[  [email protected]] INFO: 0xffffffc0498700c0-0xffffffc0498700c7. First byte 0x0 instead of 0xcc
[  [email protected]] INFO: Slab 0xffffff8041956680 objects=32 used=9 fp=0xffffffc049870980 flags=0x0081
[  [email protected]] INFO: Object 0xffffffc049870080 @offset=128 fp=0x          (null)
[  388.584484@3] 
[  [email protected]] Bytes b4 ffffffc049870070: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ZZZZZZZZZZZZZZZZ
[  [email protected]] Object ffffffc049870080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
[  [email protected]] Object ffffffc049870090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
[  [email protected]] Object ffffffc0498700a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
[  [email protected]] Object ffffffc0498700b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
[  [email protected]] Redzone ffffffc0498700c0: 00 00 00 00 00 00 00 00                          ........
[  [email protected]] Padding ffffffc0498700d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
[  [email protected]] Padding ffffffc0498700e0: 00 00 00 00 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ....ZZZZZZZZZZZZ
[  [email protected]] Padding ffffffc0498700f0: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ZZZZZZZZZZZZZZZZ
[  [email protected]] CPU: 3 PID: 7181 Comm: slabinfo Tainted: G    B      O 3.14.29 #5
[  [email protected]] Call trace:
[  388.687647@3] [<ffffffc001089390>] dump_backtrace+0x0/0x144
[  388.693161@3] [<ffffffc0010894f0>] show_stack+0x1c/0x28
[  388.698337@3] [<ffffffc001b1e854>] dump_stack+0x74/0xb8
[  388.703513@3] [<ffffffc0011b2420>] print_trailer+0x148/0x1d0
[  388.709117@3] [<ffffffc0011b2620>] check_bytes_and_report+0xec/0x124
[  388.715412@3] [<ffffffc0011b2810>] check_object+0x1b8/0x278
[  388.720933@3] [<ffffffc0011b3a60>] validate_slab_slab+0x1fc/0x24c
[  388.726969@3] [<ffffffc0011b684c>] validate_store+0xd0/0x1b4
[  388.732577@3] [<ffffffc0011b03a0>] slab_attr_store+0x40/0x60
[  388.738185@3] [<ffffffc001237ff4>] sysfs_kf_write+0x58/0x74
[  388.743704@3] [<ffffffc00123c300>] kernfs_fop_write+0xf8/0x154
[  388.749484@3] [<ffffffc0011c08e0>] vfs_write+0xac/0x198
[  388.754657@3] [<ffffffc0011c11cc>] SyS_write+0x50/0xb0
[  [email protected]] FIX kmalloc-64: Restoring 0xffffffc0498700c0-0xffffffc0498700c7=0xcc
[  388.759745@3] 
# uname -a                                                          
Linux localhost 3.14.29 #3 SMP PREEMPT Wed Jan 3 10:47:43 CST 2018 aarch64

訪問已釋放的記憶體

static void create_slue_err(void){
    buf = kmalloc(32,GFP_KERNEL);
    if(buf)  {
        /*memset(buf,0x00,33);*/
        kfree(buf);
        printk("%s\n","free buf" );
        /*kfree(buf);*/
        memset(buf,0x00,32);//訪問已釋放的記憶體
    }

    return;
}
orage/DEBC3331BC330395/slub_test_access_free_point.ko                         <
[  611.143223@1] init my_test_init 1
[  611.143255@1] free buf
[  611.143269@1] init my_test_init 2
[  611.143869@3] =============================================================================
[  [email protected]] BUG kmalloc-64 (Tainted: G    B      O): Poison overwritten
[  611.143876@3] -----------------------------------------------------------------------------
[  611.143876@3] 
[  [email protected]] INFO: 0xffffffc0115bb500-0xffffffc0115bb51f. First byte 0x0 instead of 0x6b
[  [email protected]] INFO: Slab 0xffffff8040607848 objects=32 used=32 fp=0x          (null) flags=0x0080
[  [email protected]] INFO: Object 0xffffffc0115bb500 @offset=1280 fp=0xffffffc0115bb900
[  611.143889@3] 
[  [email protected]] Bytes b4 ffffffc0115bb4f0: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ZZZZZZZZZZZZZZZZ
[  [email protected]] Object ffffffc0115bb500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
[  [email protected]] Object ffffffc0115bb510: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
[  [email protected]] Object ffffffc0115bb520: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
[  [email protected]] Object ffffffc0115bb530: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b a5  kkkkkkkkkkkkkkk.
[  [email protected]] Redzone ffffffc0115bb540: bb bb bb bb bb bb bb bb                          ........
[  [email protected]] Padding ffffffc0115bb550: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ZZZZZZZZZZZZZZZZ
[  [email protected]] Padding ffffffc0115bb560: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ZZZZZZZZZZZZZZZZ
[  [email protected]] Padding ffffffc0115bb570: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ZZZZZZZZZZZZZZZZ
[  [email protected]] CPU: 3 PID: 7236 Comm: sdcard Tainted: G    B      O 3.14.29 #3
[  [email protected]] Call trace:
[  611.143943@3] [<ffffffc001089390>] dump_backtrace+0x0/0x144
[  611.143947@3] [<ffffffc0010894f0>] show_stack+0x1c/0x28
[  611.143955@3] [<ffffffc001b1d294>] dump_stack+0x74/0xb8
[  611.143964@3] [<ffffffc0011b1a34>] print_trailer+0x148/0x1d0
[  611.143968@3] [<ffffffc0011b1c34>] check_bytes_and_report+0xec/0x124
[  611.143972@3] [<ffffffc0011b1e64>] check_object+0x1f8/0x278
[  611.143976@3] [<ffffffc0011b3d64>] alloc_debug_processing+0xbc/0x1a0
[  611.143981@3] [<ffffffc0011b4844>] __slab_alloc.isra.60.constprop.68+0x314/0x354
[  611.143985@3] [<ffffffc0011b4de8>] kmem_cache_alloc_trace+0x188/0x1bc
[  611.143993@3] [<ffffffc001377dcc>] fuse_alloc_forget+0x20/0x2c
[  611.143997@3] [<ffffffc0013709e4>] fuse_lookup_name+0x64/0x1e4
[  611.143999@3] [<ffffffc001370b98>] fuse_lookup+0x34/0x104
[  611.144006@3] [<ffffffc0011c94f0>] lookup_real+0x3c/0x7c
[  611.144009@3] [<ffffffc0011ca174>] __lookup_hash+0x50/0x6c
[  611.144014@3] [<ffffffc0011cade4>] lookup_slow+0x48/0xfc
[  611.144017@3] [<ffffffc0011ccc34>] path_lookupat+0x678/0x790
[  611.144021@3] [<ffffffc0011ccd84>] filename_lookup.isra.30+0x38/0x9c
[  611.144025@3] [<ffffffc0011cf9a0>] user_path_at_empty+0x60/0xb0
[  611.144028@3] [<ffffffc0011cfa28>] user_path_at+0x38/0x48
[  611.144032@3] [<ffffffc0011c42dc>] vfs_fstatat+0x68/0xc0
[  611.144036@3] [<ffffffc0011c4864>] SyS_newfstatat+0x34/0x58
[  [email protected]] FIX kmalloc-64: Restoring 0xffffffc0115bb500-0xffffffc0115bb51f=0x6b
[  611.144039@3] 
[  [email protected]] FIX kmalloc-64: Marking all objects used

相關推薦

linux核心記憶體問題檢測除錯

記憶體檢測: 編譯slabinfo,對應在核心原始碼tools/vm下 /* * Slabinfo: Tool to get reports about slabs * * (C) 2007 sgi, Christoph Lameter * (C

linux核心記憶體分配

核心中的記憶體分配通常通過kmalloc/kfree來進行,但是也有其它的方式來獲取記憶體,所有這些方式共同提供了核心中分配、釋放記憶體的介面。 一、kmalloc/kfree 類似於標準C中的malloc/free,kmalloc/kfree是核心中的用於常規記憶體分配的介面。 kma

記憶體管理三 核心記憶體檢測KASAN

一、簡介:         Kasan 是 Kernel Address Sanitizer 的縮寫,它是一個動態檢測記憶體錯誤的工具,主要功能是檢查記憶體越界訪問和使用已釋放的記憶體等問題。KASAN可以檢測的記憶體異常包括:slab-out-of-bo

深入理解 Linux 核心---記憶體管理

核心中的函式以比較直接了當的方式獲得動態記憶體: __get_free_pages() 或 alloc_pages() 從分割槽頁框分配器獲得頁框。 kmem_cache_alloc() 或 kmalloc() 使用 slab 分配器為專用或通用物件分配塊。 vm

不要盲目增加ip_conntrack_max-理解Linux核心記憶體

                1.由ip_conntrack引出的Linux記憶體對映有很多文章在討論關於ip_conntrack表爆滿之後丟棄資料包的問題,對此研究深入一些的知道Linux有個核心引數ip_conntrack_max,在擁有較大記憶體的機器中預設65536,於是瘋狂的增加這個引數,比如設定

不要盲目增加ip conntrack max-理解Linux核心記憶體

1.由ip_conntrack引出的Linux記憶體對映 有很多文章在討論關於ip_conntrack表爆滿之後丟棄資料包的問題,對此研究深入一些的知道Linux有個核心引數ip_conntrack_max,在擁有較大記憶體的機器中預設65536,於是瘋狂的增加這個引數,比如設定成10000…00,只要

LINUX核心記憶體管理kmalloc,vmalloc

1 #include <linux/init.h> 2 #include <linux/thread_info.h> 3 #include <linux/module.h> 4 #include <linux/sched.h> 5

深入淺出Linux核心記憶體管理基礎

1 背景 記憶體管理是Linux核心通過軟硬體協作來管理記憶體的分配及回收的一種方法。在Linux系統上電自檢(POST,Power-On-Self-Test)階段使用臨時記憶體,而系統啟動後正常執行階段的記憶體使用又有兩大類:(1)固定的記憶體分配,是永久的不變的,主要

linux核心記憶體管理學習之二(實體記憶體管理--夥伴系統)

linux使用夥伴系統來管理實體記憶體頁。 一、夥伴系統原理 1. 夥伴關係 定義:由一個母實體分成的兩個各方面屬性一致的兩個子實體,這兩個子實體就處於夥伴關係。在作業系統分配記憶體的過程中,一個記憶體塊常常被分成兩個大小相等的記憶體塊,這兩個大小相等的記憶體塊就處於夥伴關

Linux記憶體檢測工具:asan

 Linux下記憶體檢測工具:asan ASAN(Address-Sanitizier)早先是LLVM中的特性,後被加入GCC 4.8,在GCC 4.9後加入對ARM平臺的支援。因此GCC

valgrind 使用 (linux程式記憶體檢測

cachegrind是一個cache剖析器。它模擬執行CPU中的L1, D1和L2 cache,因此它能很精確的指出程式碼中的cache未命中。如果你需要,它可以打印出cache未命中的次數,記憶體引用和發生cache未命中的每一行程式碼,每一個函式,每一個模組和整個程式的摘要。如果你要求更細緻的資訊,它可以

Linux核心-記憶體-分割槽頁框分配器

簡介 分割槽頁框分配器處理對連續頁框組的記憶體分配請求,主要組成如下圖所示: 管理區分配器接受動態記憶體分配與釋放的請求,它首先從每CPU頁框快取記憶體中請求頁框,若無法滿足才從夥伴系統中請求分配。 原始碼分析(Linux2.6/mm/page

Linux核心記憶體管理架構

記憶體管理子系統可能是linux核心中最為複雜的一個子系統,其支援的功能需求眾多,如頁面對映、頁面分配、頁面回收、頁面交換、冷熱頁面、緊急頁面、頁面碎片管理、頁面快取、頁面統計等,而且對效能也有很高的要求。本文從記憶體管理硬體架構、地址空間劃分和記憶體管理軟體架構三個方面入手

linux 核心 記憶體管理 slub演算法 (一) 原理

        核心管理頁面使用了2個演算法:夥伴演算法和slub演算法,夥伴演算法以頁為單位管理記憶體,但在大多數情況下,程式需要的並不是一整頁,而是幾個、幾十個位元組的小記憶體。於是需要另外一套系統來完成對小記憶體的管理,這就是slub系統。slub系統執行在夥伴系統之

Linux核心的Kmemleak實現記憶體洩露檢測

1. Kmemleak的使用方法     a. 在uboot的bootarg中加入"kmemleak=on"     b. 在.config中使能如下配置 CONFIG_HAVE_DEBUG_KMEMLEAK=y CONFIG_DEBUG_KMEMLEAK=y CONFIG_

linux核心資料結構以及核心除錯

一、可移植性 1.1 資料型別可移植性 由於核心可能執行在不同的架構上,不同的架構具有不同的機器字長,因而可移植性對核心程式設計非常重要。核心資料使用的資料型別分為 3 個主要型別 標準C型別 明確大小的型別 用作特定核心物件的型別 1.1.1 標準 C 型別 使用標準

使用systemtap除錯Linux核心

最近在公司看Linux核心的nmi死鎖檢測功能的實現機制,當然,是因為它變了,所以我才看的,簡單來說就是在紅帽的某牛提交了一個核心patch:new nmi_watchdog using perf events,這個patch已經被合入到核心主線2.6.38版本,所以使用自該版本開始後核心的

嵌入式Linux開發——(十六)Linux核心除錯技術

1、核心列印函式printk     ①printk函式與printf函式用法格式完全相同     ②它所列印的字串頭部可以加入“<n>”樣式字元,n=0---7表示這條資訊的記錄  級別     ③對於p

記憶體管理十 linux核心併發與同步機制

一、臨界資源:   臨界區是指訪問或操作共享資源的程式碼段,這些資源無法同時被多個執行執行緒訪問,為了避免臨界區的併發 訪問,需要保證臨界區的原子性,臨界區不能有多個併發源同時執行,原子性保護的是資源和資料,包括靜態區域性 變數、全域性變數、共享的資料結構、Buffer快取等各種資源資料

Linux 核心動態除錯

轉載地址:https://blog.csdn.net/u014782704/article/details/78092846 原始碼使用pr_debug(), pr_info(), pr_err()等pr_xxx()家族列印函式 需要列印時(即動態除錯), 在命令列輸入以下命令, 包含在fu