1. 程式人生 > >Linux核心除錯方法總結

Linux核心除錯方法總結

核心開發比使用者空間開發更難的一個因素就是核心除錯艱難。核心錯誤往往會導致系統宕機,很難保留出錯時的現場。除錯核心的關鍵在於你的對核心的深刻理解。 

一  除錯前的準備

在除錯一個bug之前,我們所要做的準備工作有: 

  • 有一個被確認的bug。

  • 包含這個bug的核心版本號,需要分析出這個bug在哪一個版本被引入,這個對於解決問題有極大的幫助。可以採用二分查詢法來逐步鎖定bug引入版本號。

  • 對核心程式碼理解越深刻越好,同時還需要一點點運氣。

  • 該bug可以復現。如果能夠找到復現規律,那麼離找到問題的原因就不遠了。

  • 最小化系統。把可能產生bug的因素逐一排除掉。

二  核心中的bug

核心中的bug也是多種多樣的。它們的產生有無數的原因,同時表象也變化多端。從隱藏在原始碼中的錯誤到展現在目擊者面前的bug,其發作往往是一系列連鎖反應的事件才可能出發的。雖然核心除錯有一定的困難,但是通過你的努力和理解,說不定你會喜歡上這樣的挑戰。 

三  核心除錯配置選項

學習編寫驅動程式要構建安裝自己的核心(標準主線核心)。最重要的原因之一是:核心開發者已經建立了多項用於除錯的功能。但是由於這些功能會造成額外的輸出,並導致能下降,因此發行版廠商通常會禁止發行版核心中的除錯功能。 

1  核心配置

為了實現核心除錯,在核心配置上增加了幾項:

 Kernel hacking  --->      
[*]   Magic SysRq key 
[*]   Kernel debugging 
[*]   Debug slab memory allocations   
[*]   Spinlock and rw-lock debugging: basic checks 
[*]   Spinlock debugging: sleep-inside-spinlock checking 
           [*]   Compile the kernel with debug info   
Device Drivers  --->   
           Generic Driver Options  --->             [*]   Driver Core verbose debug messages  General setup  --->             [*]   Configure standard kernel features (for small systems)  --->             [*]   Load all symbols for debugging/ksymoops

啟用選項例如: 

slab layer debugging(slab層除錯選項) 
high-memory debugging(高階記憶體除錯選項) 
I/O mapping debugging(I/O對映除錯選項) 
spin-lock debugging(自旋鎖除錯選項) 
stack-overflow checking(棧溢位檢查選項) 
sleep-inside-spinlock checking(自旋鎖內睡眠選項)

2  除錯原子操作

從核心2.5開發,為了檢查各類由原子操作引發的問題,核心提供了極佳的工具。 
核心提供了一個原子操作計數器,它可以配置成,一旦在原子操作過程中,進城進入睡眠或者做了一些可能引起睡眠的操作,就列印警告資訊並提供追蹤線索。 
所以,包括在使用鎖的時候呼叫schedule(),正使用鎖的時候以阻塞方式請求分配記憶體等,各種潛在的bug都能夠被探測到。 
下面這些選項可以最大限度地利用該特性: 

CONFIG_PREEMPT = y 
CONFIG_DEBUG_KERNEL = y 
CONFIG_KLLSYMS = y 
CONFIG_SPINLOCK_SLEEP = y

四  引發bug並列印資訊

1  BUG()和BUG_ON()

一些核心呼叫可以用來方便標記bug,提供斷言並輸出資訊。最常用的兩個是BUG()和BUG_ON()。

定義在<include/asm-generic>中:

#ifndef HAVE_ARCH_BUG 
#define BUG() do { 
   printk("BUG: failure at %s:%d/%s()! ", __FILE__, __LINE__, __FUNCTION__); 
   panic("BUG!");   /* 引發更嚴重的錯誤,不但列印錯誤訊息,而且整個系統業會掛起 */ 
} while (0#endif 

#ifndef HAVE_ARCH_BUG_ON 
   #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0#endif

當呼叫這兩個巨集的時候,它們會引發OOPS,導致棧的回溯和錯誤訊息的列印。 
※ 可以把這兩個呼叫當作斷言使用,如:BUG_ON(bad_thing); 

2  dump_stack()

有些時候,只需要在終端上列印一下棧的回溯資訊來幫助你除錯。這時可以使用dump_stack()。這個函式只在終端上列印暫存器上下文和函式的跟蹤線索。 

   if (!debug_check) { 
       printk(KERN_DEBUG “provide some information…/n”); 
       dump_stack(); 
   }

五  printk()

核心提供的格式化列印函式。 

1  printk函式的健壯性

      健壯性是printk最容易被接受的一個特質,幾乎在任何地方,任何時候核心都可以呼叫它(中斷上下文、程序上下文、持有鎖時、多處理器處理時等)。 

2  printk函式脆弱之處

      在系統啟動過程中,終端初始化之前,在某些地方是不能呼叫的。如果真的需要除錯系統啟動過程最開始的地方,有以下方法可以使用: 

  • 使用串列埠除錯,將除錯資訊輸出到其他終端裝置。

  • 使用early_printk(),該函式在系統啟動初期就有列印能力。但它只支援部分硬體體系。

3  LOG等級

       printk和printf一個主要的區別就是前者可以指定一個LOG等級。核心根據這個等級來判斷是否在終端上列印訊息。核心把比指定等級高的所有訊息顯示在終端。 
       可以使用下面的方式指定一個LOG級別: 
printk(KERN_CRIT  “Hello, world!\n”); 
注意,第一個引數並不一個真正的引數,因為其中沒有用於分隔級別(KERN_CRIT)和格式字元的逗號(,)。KERN_CRIT本身只是一個普通的字串(事實上,它表示的是字串 "<2>";表 1 列出了完整的日誌級別清單)。作為預處理程式的一部分,C 會自動地使用一個名為 字串串聯 的功能將這兩個字串組合在一起。組合的結果是將日誌級別和使用者指定的格式字串包含在一個字串中。 

核心使用這個指定LOG級別與當前終端LOG等級console_loglevel來決定是不是向終端列印。 
下面是可使用的LOG等級: 

#define KERN_EMERG      "<0>"   /* system is unusable                            */
#define KERN_ALERT        "<1>"   /* action must be taken immediately     */ 
#define KERN_CRIT           "<2>"   /* critical conditions                                */
#define KERN_ERR            "<3>"   /* error conditions                                   */
#define KERN_WARNING  "<4>"   /* warning conditions                              */
#define KERN_NOTICE       "<5>"   /* normal but significant condition         */
#define KERN_INFO            "<6>"   /* informational                                       */
#define KERN_DEBUG        "<7>"   /* debug-level messages                       */
#define KERN_DEFAULT     "<d>"   /* Use the default kernel loglevel           */

注意,如果呼叫者未將日誌級別提供給 printk,那麼系統就會使用預設值 KERN_WARNING "<4>"(表示只有KERN_WARNING 級別以上的日誌訊息會被記錄)。由於預設值存在變化,所以在使用時最好指定LOG級別。有LOG級別的一個好處就是我們可以選擇性的輸出LOG。比如平時我們只需要列印KERN_WARNING級別以上的關鍵性LOG,但是除錯的時候,我們可以選擇列印KERN_DEBUG等以上的詳細LOG。而這些都不需要我們修改程式碼,只需要通過命令修改預設日誌輸出級別: 

[email protected] :~$ cat /proc/sys/kernel/printk
4 4 1 7
[email protected] :~$ cat /proc/sys/kernel/printk_delay
0
[email protected] :~$ cat /proc/sys/kernel/printk_ratelimit
5
[email protected] :~$ cat /proc/sys/kernel/printk_ratelimit_burst
10

第一項定義了 printk API 當前使用的日誌級別。這些日誌級別表示了控制檯的日誌級別、預設訊息日誌級別、最小控制檯日誌級別和預設控制檯日誌級別。printk_delay 值表示的是 printk 訊息之間的延遲毫秒數(用於提高某些場景的可讀性)。注意,這裡它的值為 0,而它是不可以通過 /proc 設定的。printk_ratelimit 定義了訊息之間允許的最小時間間隔(當前定義為每 5 秒內的某個核心訊息數)。訊息數量是由 printk_ratelimit_burst 定義的(當前定義為 10)。如果您擁有一個非正式核心而又使用有頻寬限制的控制檯裝置(如通過串列埠), 那麼這非常有用。注意,在核心中,速度限制是由呼叫者控制的,而不是在printk 中實現的。如果一個 printk 使用者要求進行速度限制,那麼該使用者就需要呼叫printk_ratelimit 函式。 

4  記錄緩衝區

  核心訊息都被儲存在一個LOG_BUF_LEN大小的環形佇列中。 
  關於LOG_BUF_LEN定義: 

 #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
  ※ 變數CONFIG_LOG_BUF_SHIFT在核心編譯時由配置檔案定義,對於i386平臺,其值定義如下(在linux26/arch/i386/defconfig中): 
CONFIG_LOG_BUF_SHIFT=18

  記錄緩衝區操作: 
  ① 訊息被讀出到使用者空間時,此訊息就會從環形佇列中刪除。 
  ② 當訊息緩衝區滿時,如果再有printk()呼叫時,新訊息將覆蓋佇列中的老訊息。 
  ③ 在讀寫環形佇列時,同步問題很容易得到解決。 

  ※ 這個紀錄緩衝區之所以稱為環形,是因為它的讀寫都是按照環形佇列的方式進行操作的。

5  syslogd/klogd

在標準的Linux系統上,使用者空間的守護程序klogd從紀錄緩衝區中獲取核心訊息,再通過syslogd守護程序把這些訊息儲存在系統日誌檔案中。klogd程序既可以從/proc/kmsg檔案中,也可以通過syslog()系統呼叫讀取這些訊息。預設情況下,它選擇讀取/proc方式實現。klogd守護程序在訊息緩衝區有新的訊息之前,一直處於阻塞狀態。一旦有新的核心訊息,klogd被喚醒,讀出核心訊息並進行處理。預設情況下,處理例程就是把核心訊息傳給syslogd守護程序。syslogd守護程序一般把接收到的訊息寫入/var/log/messages檔案中。不過,還是可以通過/etc/syslog.conf檔案來進行配置,可以選擇其他的輸出檔案。

6  dmesg

dmesg 命令也可用於列印和控制核心環緩衝區。這個命令使用 klogctl 系統呼叫來讀取核心環緩衝區,並將它轉發到標準輸出(stdout)。這個命令也可以用來清除核心環緩衝區(使用 -c 選項),設定控制檯日誌級別(-n 選項),以及定義用於讀取核心日誌訊息的緩衝區大小(-s 選項)。注意,如果沒有指定緩衝區大小,那麼 dmesg 會使用 klogctl 的SYSLOG_ACTION_SIZE_BUFFER 操作確定緩衝區大小。 

7 注意 

a) 雖然printk很健壯,但是看了原始碼你就知道,這個函式的效率很低:做字元拷貝時一次只拷貝一個位元組,且去呼叫console輸出可能還產生中斷。所以如果你的驅動在功能除錯完成以後做效能測試或者釋出的時候千萬記得儘量減少printk輸出,做到僅在出錯時輸出少量資訊。否則往console輸出無用資訊影響效能。 
b) printk的臨時快取printk_buf只有1K,所有一次printk函式只能記錄<1K的資訊到log buffer,並且printk使用的“ringbuffer”. 

8 核心printk和日誌系統的總體結構

9  動態除錯

動態除錯是通過動態的開啟和禁止某些核心程式碼來獲取額外的核心資訊。 
首先核心選項CONFIG_DYNAMIC_DEBUG應該被設定。所有通過pr_debug()/dev_debug()列印的資訊都可以動態的顯示或不顯示。 
可以通過簡單的查詢語句來篩選需要顯示的資訊。 

-原始檔名

-函式名

-行號(包括指定範圍的行號)

-模組名

-格式化字串

將要列印資訊的格式寫入<debugfs>/dynamic_debug/control中。 

nullarbor:~ # echo 'file svcsock.c line 1603 +p' >      <debugfs>/dynamic_debug/control

六  記憶體除錯工具

1  MEMWATCH

MEMWATCH 由 Johan Lindh 編寫,是一個開放原始碼 C 語言記憶體錯誤檢測工具,您可以自己下載它。只要在程式碼中新增一個頭檔案並在 gcc 語句中定義了 MEMWATCH 之後,您就可以跟蹤程式中的記憶體洩漏和錯誤了。MEMWATCH 支援ANSIC,它提供結果日誌紀錄,能檢測雙重釋放(double-free)、錯誤釋放(erroneous free)、沒有釋放的記憶體(unfreedmemory)、溢位和下溢等等。 
清單 1. 記憶體樣本(test1.c)

#include <stdlib.h>
#include <stdio.h>
#include "memwatch.h"
int main(void)
{
 char *ptr1;
 char *ptr2;
 ptr1 = malloc(512);
 ptr2 = malloc(512);
 ptr2 = ptr1;
 free(ptr2);
 free(ptr1);
}

清單 1 中的程式碼將分配兩個 512 位元組的記憶體塊,然後指向第一個記憶體塊的指標被設定為指向第二個記憶體塊。結果,第二個記憶體塊的地址丟失,從而產生了記憶體洩漏。 
現在我們編譯清單 1 的 memwatch.c。下面是一個 makefile 示例: 
test1

gcc -DMEMWATCH -DMW_STDIO test1.c memwatch
c -o test1

當您執行 test1 程式後,它會生成一個關於洩漏的記憶體的報告。清單 2 展示了示例 memwatch.log 輸出檔案。 

清單 2. test1 memwatch.log 檔案

MEMWATCH 2.67 Copyright (C) 1992-1999 Johan Lindh
...
double-free: <4> test1.c(15), 0x80517b4 was freed from test1.c(14)
...
unfreed: <2> test1.c(11), 512 bytes at 0x80519e4
{FE FE FE FE FE FE FE FE FE FE FE FE ..............}
Memory usage statistics (global):
 N)umber of allocations made: 2
 L)argest memory usage : 1024
 T)otal of all alloc() calls: 1024
 U)nfreed bytes totals : 512

MEMWATCH 為您顯示真正導致問題的行。如果您釋放一個已經釋放過的指標,它會告訴您。對於沒有釋放的記憶體也一樣。日誌結尾部分顯示統計資訊,包括洩漏了多少記憶體,使用了多少記憶體,以及總共分配了多少記憶體。

2  YAMD

YAMD 軟體包由 Nate Eldredge 編寫,可以查詢 C 和 C++ 中動態的、與記憶體分配有關的問題。在撰寫本文時,YAMD 的最新版本為 0.32。請下載 yamd-0.32.tar.gz。執行 make 命令來構建程式;然後執行 make install 命令安裝程式並設定工具。 
一旦您下載了 YAMD 之後,請在 test1.c 上使用它。請刪除 #include memwatch.h 並對 makefile 進行如下小小的修改: 
使用 YAMD 的 test1

gcc -g test1.c -o test1

清單 3 展示了來自 test1 上的 YAMD 的輸出。 
清單 3. 使用 YAMD 的 test1 輸出

YAMD version 0.32
Executable: /usr/src/test/yamd-0.32/test1
...
INFO: Normal allocation of this block
Address 0x40025e00, size 512
...
INFO: Normal allocation of this block
Address 0x40028e00, size 512
...
INFO: Normal deallocation of this block
Address 0x40025e00, size 512
...
ERROR: Multiple freeing At
free of pointer already freed
Address 0x40025e00, size 512
...
WARNING: Memory leak
Address 0x40028e00, size 512
WARNING: Total memory leaks:
1 unfreed allocations totaling 512 bytes
*** Finished at Tue ... 10:07:15 2002
Allocated a grand total of 1024 bytes 2 allocations
Average of 512 bytes per allocation
Max bytes allocated at one time: 1024
24 K alloced internally / 12 K mapped now / 8 K max
Virtual program size is 1416 K
End.

YAMD 顯示我們已經釋放了記憶體,而且存在記憶體洩漏。讓我們在清單 4 中另一個樣本程式上試試 YAMD。 
清單 4. 記憶體程式碼(test2.c)

#include <stdlib.h>
#include <stdio.h>
int main(void)
{
 char *ptr1;
 char *ptr2;
 char *chptr;
 int i = 1;
 ptr1 = malloc(512);
 ptr2 = malloc(512);
 chptr = (char *)malloc(512);
 for (i; i <= 512; i++) {
   chptr[i] = 'S';
 } 
 ptr2 = ptr1;
 free(ptr2);
 free(ptr1);
 free(chptr);
}
您可以使用下面的命令來啟動 YAMD: 
./run-yamd /usr/src/test/test2/test2

清單 5 顯示了在樣本程式 test2 上使用 YAMD 得到的輸出。YAMD 告訴我們在 for 迴圈中有“越界(out-of-bounds)”的情況。 
清單 5. 使用 YAMD 的 test2 輸出

Running /usr/src/test/test2/test2
Temp output to /tmp/yamd-out.1243
*********
./run-yamd: line 1011248 Segmentation fault (core dumped)
YAMD version 0.32
Starting run: /usr/src/test/test2/test2
Executable: /usr/src/test/test2/test2
Virtual program size is 1380 K
...
INFO: Normal allocation of this block
Address 0x40025e00, size 512
...
INFO: Normal allocation of this block
Address 0x40028e00, size 512
...
INFO: Normal allocation of this block
Address 0x4002be00, size 512
ERROR: Crash
...
Tried to write address 0x4002c000
Seems to be part of this block:
Address 0x4002be00, size 512
...
Address in question is at offset 512 (out of bounds)
Will dump core after checking heap.
Done.

MEMWATCH 和 YAMD 都是很有用的除錯工具,它們的使用方法有所不同。對於 MEMWATCH,您需要新增包含檔案memwatch.h 並開啟兩個編譯時間標記。對於連結(link)語句,YAMD 只需要 -g 選項。 

3  Electric Fence

多數 Linux 分發版包含一個 Electric Fence 包,不過您也可以選擇下載它。Electric Fence 是一個由 Bruce Perens 編寫的malloc()除錯庫。它就在您分配記憶體後分配受保護的記憶體。如果存在 fencepost 錯誤(超過陣列末尾執行),程式就會產生保護錯誤,並立即結束。通過結合 Electric Fence 和 gdb,您可以精確地跟蹤到哪一行試圖訪問受保護記憶體。ElectricFence 的另一個功能就是能夠檢測記憶體洩漏。 

七  strace

strace 命令是一種強大的工具,它能夠顯示所有由使用者空間程式發出的系統呼叫。strace 顯示這些呼叫的引數並返回符號形式的值。strace 從核心接收資訊,而且不需要以任何特殊的方式來構建核心。將跟蹤資訊傳送到應用程式及核心開發者都很有用。在清單 6 中,分割槽的一種格式有錯誤,清單顯示了 strace 的開頭部分,內容是關於調出建立檔案系統操作(mkfs )的。strace 確定哪個呼叫導致問題出現。 
清單 6. mkfs 上 strace 的開頭部分

execve("/sbin/mkfs.jfs", ["mkfs.jfs""-f""/dev/test1"], &
...
open("/dev/test1", O_RDWR|O_LARGEFILE) = 4
stat64("/dev/test1", {st_mode=&, st_rdev=makedev(63255), ...}) = 
            
           

相關推薦

Linux核心除錯方法總結

核心開發比使用者空間開發更難的一個因素就是核心除錯艱難。核心錯誤往往會導致系統宕機,很難保留出錯時的現場。除錯核心的關鍵在於你的對核心的深刻理解。  一  除錯前的準備 在除錯一個bug之前,我們所要做的準備工作有:  有一個被確認的bug。 包含這

linux核心除錯方法

核心開發比使用者空間開發更難的一個因素就是核心除錯艱難。核心錯誤往往會導致系統宕機,很難保留出錯時的現場。除錯核心的關鍵在於你的對核心的深刻理解。 一  除錯前的準備 在除錯一個bug之前,我們所要做的準備工作有: 有一個被確認的bug。 包含這個bug的核心

linux 核心除錯方法

kdb:只能在彙編程式碼級進行除錯;   優點是不需要兩臺機器進行除錯。   gdb:在除錯模組時缺少一些至關重要的功能,它可用來檢視核心的執行情況,包括反彙編核心函式。   kgdb:能很方便的在原始碼級對核心進行除錯,缺點是kgdb只能進行遠端除錯,它需要一根串列埠線及兩臺機器來除錯核心(也可以是在同一

Linux核心除錯printk()總結

我們在使用printk()函式中使用日誌級別為的是使程式設計人員在程式設計過程中自定義地進行資訊的輸出,更加容易地掌握系統當前的狀況。 對程式的除錯起到了很重要的作用。 (下文中的日誌級別和控制檯日誌控制級別是一個意思) printk(日誌級別 "訊息文字");這裡的日誌級

ubuntu下linux核心原始碼閱讀工具和除錯方法總結 (2010-10-31 15:21)

一 linux核心原始碼閱讀工具 windows下當然首選source insight, 但是linux下就沒有source insight這麼優秀的工具了,但是也有不少的替代品,但覺絕對部分人會選擇vim+ctags+cscope的組合,還有部分人或選擇wine中的source insight或選擇nav

linux裝置驅動學習筆記--核心除錯方法之printk

1,printk類似於使用者態的printf函式,但是比printf函式多了一個日誌級別,核心中最常見的日誌輸出都是通過呼叫printk來實現的,其列印級別有8種可能的記錄字串, 在標頭檔案 <linux/kernel.h> 裡定義: KERN_EMERG

linux裝置驅動學習筆記--核心除錯方法之proc(補充seq_file)

上一節中的proc實現對於開關檔案,控制檔案,以及顯示很少資訊的檔案來說還是比較簡單的,但是對於需要輸出大量資訊像meminfo,或者結構化的資訊像cpuinfo等時就會顯得很笨拙,並且程式碼也很不好理解與維護。核心為了簡化這種proc檔案的實現提供了另外一種方案----s

linux裝置驅動學習筆記--核心除錯方法之proc

/proc 檔案系統是 GNU/Linux 特有的。它是一個虛擬的檔案系統,因此在該目錄中的所有檔案都不會消耗磁碟空間。通過它能夠非常簡便地瞭解系統資訊,尤其是其中的大部分檔案是人類可閱讀的(不過還是需要一些幫助)。許多程式實際上只是從 /proc 的檔案中收集資訊,然後按

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

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

linux核心除錯技巧之一 dump_stack【轉】

在核心中程式碼呼叫過程難以跟蹤,上下文關係複雜,確實讓人頭痛 呼叫dump_stack()就會列印當前cpu的堆疊的呼叫函數了。 如此,一目瞭然的就能看到當前上下文環境,呼叫關係了 假設: 遇到uvc_probe_video這麼一個函式,不知道它最終是被誰呼叫到的,根據linux裝置模型,初步推測,p

Linux 核心學習經驗總結

  Linux 核心學習經驗總結   學習核心,每個人都有自己的學習方法,仁者見仁智者見智。以下是我在學習過程中總結出來的東西,對自身來說,我認為比較有效率,拿出來跟大家交流一下。   核心學習,一偏之見;疏漏難免,懇請指正。   為什麼寫這篇部落格   剛開始學核心的時候,不要執著於一個方面,不要專

使用yum更新時不升級Linux核心方法

由於系統與硬體的相容性問題,有可能升級核心後導致伺服器不能正常啟動,這是非常可怕的,如果沒有特別的需要,建議不要隨意 升級核心! RedHat/CentOS/Fedora使用  yum update

linux核心除錯環境搭建

版本linux4.17 ubuntu18.04先給系統至少80G記憶體1。編譯核心先配置檔案make mrpropermake menuconfig我這裡需要的依賴有 sudo apt install make cmake gcc g++ clang sudo apt-get install libnc

shell獲取linux系統引數方法總結

Mask  ifconfig |grep inet| sed -n '1p'|awk '{print $4}'|awk -F ':' '{print $2}' IP ifconfig |grep inet| sed -n '1p'|awk '{print $2}'|awk

Linux核心除錯的方式以及工具集錦

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可, 轉載請註明出處, 謝謝合作 因本人技術水平和知識面有限, 內容如有紕漏或者需要修正的地方, 歡迎大家指正, 也歡迎大家提供一些其他好的除錯工具以供收錄, 鄙人在此謝

Linux核心升級方法與步驟

1. 檢視linux核心版本:# uname -r 2.6.18-194.el5 2. 下載新的核心版本: 去官網上下載最新的核心版本和對應的補丁: https://www.kernel.org/ 選的是3.2.14#wget -c http://www.kernel.org/pub/li

手機端web頁除錯方法總結(一)

如何檢視app中web頁的原始碼: 目前可用的解決辦法是使用Chrome瀏覽器提供的“”檢查裝置“”功能。 準備:最新的Chrome版本,vpn賬號(使用該功能需要翻牆),一根資料線。 準備完畢之後,將手機通過資料線連線到電腦,最好電腦下載一個手機助手,確保USB已連線上。

linux除錯方法記錄

1、segment fault segment fault是幾乎多有C程式設計師都會碰到的問題,多為記憶體問題,因為glibc庫中基本所有的函式都預設形參指標是非空的,這樣以下原因就可能導致段錯誤: (1)引用一個包含非法值的指標(當然包括空指標)。 (2)未得到正確的許可

linux核心除錯技巧四:gdb除錯+vmlinux

vmlinux是個elf檔案,它的符號表中包含了所有核心符號。 注意linux中很多檔案是沒有後綴的,比如我見到的這個elf檔案的檔名是“vmlinux-3.10.62”,沒有後綴。 既然是elf檔案

linux 核心除錯技術

核心開發比使用者空間開發更難的一個因素就是核心除錯艱難。核心錯誤往往會導致系統宕機,很難保留出錯時的現場。除錯核心的關鍵在於你的對核心的深刻理解。 一  除錯前的準備 在除錯一個bug之前,我們所要做的準備工作有: 有一個被確認的bug。 包含這個bug的核心版本號,需要分析出這個b