ºìÁªLinuxÃÅ»§
Linux°ïÖú

ÔÚLinuxÉÏÕÒ³ö²¢½â¾ö³ÌÐò´íÎóµÄÖ÷Òª·½·¨

·¢²¼Ê±¼ä:2006-09-06 01:24:45À´Ô´:ºìÁª×÷Õß:pinkfirex
¡¡¡¡Äú¿ÉÒÔÓø÷ÖÖ·½·¨À´¼à¿ØÔËÐÐ×ŵÄÓû§¿Õ¼ä³ÌÐò£º¿ÉÒÔΪÆäÔËÐе÷ÊÔÆ÷²¢µ¥²½µ÷ÊԸóÌÐò£¬Ìí¼Ó´òÓ¡Óï¾ä£¬»òÕßÌí¼Ó¹¤¾ßÀ´·ÖÎö³ÌÐò¡£±¾ÎÄÃèÊöÁ˼¸ÖÖ¿ÉÒÔÓÃÀ´µ÷ÊÔÔÚ Linux ÉÏÔËÐеijÌÐòµÄ·½·¨¡£ÎÒÃǽ«»Ø¹ËËÄÖÖµ÷ÊÔÎÊÌâµÄÇé¿ö£¬ÕâЩÎÊÌâ°üÀ¨¶Î´íÎó£¬ÄÚ´æÒç³öºÍй©£¬»¹ÓÐ¹ÒÆð¡£

¡¡¡¡±¾ÎÄÌÖÂÛÁËËÄÖÖµ÷ÊÔ Linux ³ÌÐòµÄÇé¿ö¡£ÔÚµÚ 1 ÖÖÇé¿öÖУ¬ÎÒÃÇʹÓÃÁËÁ½¸öÓÐÄÚ´æ·ÖÅäÎÊÌâµÄÑù±¾³ÌÐò£¬Ê¹Óà MEMWATCH ºÍ Yet Another Malloc Debugger£¨YAMD£©¹¤¾ßÀ´µ÷ÊÔËüÃÇ¡£ÔÚµÚ 2 ÖÖÇé¿öÖУ¬ÎÒÃÇʹÓÃÁË Linux ÖÐµÄ strace ʵÓóÌÐò£¬ËüÄܹ»¸ú×Ùϵͳµ÷ÓúÍÐźţ¬´Ó¶øÕÒ³ö³ÌÐò·¢Éú´íÎóµÄµØ·½¡£ÔÚµÚ 3 ÖÖÇé¿öÖУ¬ÎÒÃÇʹÓà Linux ÄÚºËµÄ Oops ¹¦ÄÜÀ´½â¾ö³ÌÐòµÄ¶Î´íÎ󣬲¢ÏòÄúչʾÈçºÎÉèÖÃÄÚºËÔ´´úÂë¼¶µ÷ÊÔÆ÷£¨kernel source level debugger£¬kgdb£©£¬ÒÔʹÓà GNU µ÷ÊÔÆ÷£¨GNU debugger£¬gdb£©À´½â¾öÏàͬµÄÎÊÌ⣻kgdb ³ÌÐòÊÇʹÓô®ÐÐÁ¬½ÓµÄ Linux ÄÚºËÔ¶³Ì gdb¡£ÔÚµÚ 4 ÖÖÇé¿öÖУ¬ÎÒÃÇʹÓà Linux ÉÏÌṩµÄħÊõ¼ü¿ØË³Ðò£¨magic key sequence£©À´ÏÔʾÒý·¢¹ÒÆðÎÊÌâµÄ×é¼þµÄÐÅÏ¢¡£

³£¼ûµ÷ÊÔ·½·¨

¡¡¡¡µ±ÄúµÄ³ÌÐòÖаüº¬´íÎóʱ£¬ºÜ¿ÉÄÜÔÚ´úÂëÖÐij´¦ÓÐÒ»¸öÌõ¼þ£¬ÄúÈÏΪËüÎªÕæ£¨true£©£¬µ«Êµ¼ÊÉÏÊǼ٣¨false£©¡£ÕÒ³ö´íÎóµÄ¹ý³ÌÒ²¾ÍÊÇÔÚÕÒ³ö´íÎóºóÍÆ·­ÒÔǰһֱȷÐÅÎªÕæµÄij¸öÌõ¼þ¹ý³Ì¡£

¡¡¡¡ÒÔϼ¸¸öʾÀýÊÇÄú¿ÉÄÜÈ·ÐųÉÁ¢µÄÌõ¼þµÄһЩÀàÐÍ£º

¡¡¡¡ÔÚÔ´´úÂëÖеÄij´¦£¬Ä³±äÁ¿ÓÐÌØ¶¨µÄÖµ¡£
¡¡¡¡ÔÚ¸ø¶¨µÄµØ·½£¬Ä³¸ö½á¹¹Òѱ»ÕýÈ·ÉèÖá£
¡¡¡¡¶ÔÓÚ¸ø¶¨µÄ if-then-else Óï¾ä£¬if ²¿·Ö¾ÍÊDZ»Ö´ÐеÄ·¾¶¡£
¡¡¡¡µ±×ÓÀý³Ì±»µ÷ÓÃʱ£¬¸ÃÀý³ÌÕýÈ·µØ½ÓÊÕµ½ÁËËüµÄ²ÎÊý¡£

¡¡¡¡ÕÒ³ö´íÎóÒ²¾ÍÊÇҪȷ¶¨ÉÏÊöËùÓÐÇé¿öÊÇ·ñ´æÔÚ¡£Èç¹ûÄúÈ·ÐÅÔÚ×ÓÀý³Ì±»µ÷ÓÃʱij±äÁ¿Ó¦¸ÃÓÐÌØ¶¨µÄÖµ£¬ÄÇô¾Í¼ì²éÒ»ÏÂÇé¿öÊÇ·ñÈç´Ë¡£Èç¹ûÄúÏàÐÅ if ½á¹¹»á±»Ö´ÐУ¬ÄÇôҲ¼ì²éÒ»ÏÂÇé¿öÊÇ·ñÈç´Ë¡£Í¨³££¬ÄúµÄ¼ÙÉè¶¼»áÊÇÕýÈ·µÄ£¬µ«×îÖÕÄú»áÕÒµ½Óë¼ÙÉè²»·ûµÄÇé¿ö¡£½á¹û£¬Äú¾Í»áÕÒ³ö·¢Éú´íÎóµÄµØ·½¡£

¡¡¡¡µ÷ÊÔÊÇÄúÎÞ·¨ÌӱܵÄÈÎÎñ¡£½øÐе÷ÊÔÓкܶàÖÖ·½·¨£¬±ÈÈ罫ÏûÏ¢´òÓ¡µ½ÆÁÄ»ÉÏ¡¢Ê¹Óõ÷ÊÔÆ÷£¬»òÖ»ÊÇ¿¼ÂdzÌÐòÖ´ÐеÄÇé¿ö²¢×ÐϸµØ´§Ä¦ÎÊÌâËùÔÚ¡£

¡¡¡¡ÔÚÐÞÕýÎÊÌâ֮ǰ£¬Äú±ØÐëÕÒ³öËüµÄÔ´Í·¡£¾ÙÀýÀ´Ëµ£¬¶ÔÓڶδíÎó£¬ÄúÐèÒªÁ˽â¶Î´íÎó·¢ÉúÔÚ´úÂëµÄÄÄÒ»ÐС£Ò»µ©Äú·¢ÏÖÁË´úÂëÖгö´íµÄÐУ¬ÇëÈ·¶¨¸Ã·½·¨ÖбäÁ¿µÄÖµ¡¢·½·¨±»µ÷Óõķ½Ê½ÒÔ¼°¹ØÓÚ´íÎóÈçºÎ·¢ÉúµÄÏêϸÇé¿ö¡£Ê¹Óõ÷ÊÔÆ÷½«Ê¹ÕÒ³öËùÓÐÕâЩÐÅÏ¢±äµÃºÜ¼òµ¥¡£Èç¹ûûÓе÷ÊÔÆ÷¿ÉÓã¬Äú»¹¿ÉÒÔʹÓÃÆäËüµÄ¹¤¾ß¡££¨Çë×¢Ò⣬²úÆ·»·¾³ÖпÉÄܲ¢²»Ìṩµ÷ÊÔÆ÷£¬¶øÇÒ Linux ÄÚºËûÓÐÄÚ½¨µÄµ÷ÊÔÆ÷¡££©

ʵÓõÄÄÚ´æºÍÄں˹¤¾ß

¡¡¡¡Äú¿ÉÒÔʹÓà Linux Éϵĵ÷ÊÔ¹¤¾ß£¬Í¨¹ý¸÷ÖÖ·½Ê½¸ú×ÙÓû§¿Õ¼äºÍÄÚºËÎÊÌâ¡£ÇëʹÓÃÏÂÃæµÄ¹¤¾ßºÍ¼¼ÊõÀ´¹¹½¨ºÍµ÷ÊÔÄúµÄÔ´´úÂ룺
¡¡¡¡Óû§¿Õ¼ä¹¤¾ß£º

¡¡¡¡Äڴ湤¾ß£ºMEMWATCH ºÍ YAMD
¡¡¡¡strace
¡¡¡¡GNU µ÷ÊÔÆ÷£¨gdb£©
¡¡¡¡Ä§Êõ¼ü¿ØË³Ðò

¡¡¡¡Äں˹¤¾ß£º

¡¡¡¡ÄÚºËÔ´´úÂë¼¶µ÷ÊÔÆ÷£¨kgdb£©
¡¡¡¡ÄÚ½¨Äں˵÷ÊÔÆ÷£¨kdb£©
¡¡¡¡Oops

¡¡¡¡±¾ÎĽ«ÌÖÂÛÒ»Ààͨ¹ýÈ˹¤¼ì²é´úÂë²»ÈÝÒ×ÕÒµ½µÄÎÊÌ⣬¶øÇÒ´ËÀàÎÊÌâÖ»ÔÚºÜÉÙ¼ûµÄÇé¿öÏ´æÔÚ¡£ÄÚ´æ´íÎóͨ³£ÔÚ¶àÖÖÇé¿öͬʱ´æÔÚʱ³öÏÖ£¬¶øÇÒÄúÓÐʱֻÄÜÔÚ²¿Êð³ÌÐòÖ®ºó²ÅÄÜ·¢ÏÖÄÚ´æ´íÎó¡£

¡¡¡¡µÚ 1 ÖÖÇé¿ö£ºÄÚ´æµ÷ÊÔ¹¤¾ß

¡¡¡¡C ÓïÑÔ×÷Ϊ Linux ϵͳÉϱê×¼µÄ±à³ÌÓïÑÔ¸øÓèÁËÎÒÃǶԶ¯Ì¬ÄÚ´æ·ÖÅäºÜ´óµÄ¿ØÖÆÈ¨¡£È»¶ø£¬ÕâÖÖ×ÔÓÉ¿ÉÄܻᵼÖÂÑÏÖØµÄÄÚ´æ¹ÜÀíÎÊÌ⣬¶øÕâЩÎÊÌâ¿ÉÄܵ¼Ö³ÌÐò±ÀÀ£»òËæÊ±¼äµÄÍÆÒÆµ¼ÖÂÐÔÄܽµ¼¶¡£

¡¡¡¡ÄÚ´æÐ¹Â©£¨¼´ malloc() ÄÚ´æÔÚ¶ÔÓ¦µÄ free() µ÷ÓÃÖ´ÐкóÓÀ²»±»ÊÍ·Å£©ºÍ»º³åÇøÒç³ö£¨ÀýÈç¶ÔÒÔǰ·ÖÅ䵽ijÊý×éµÄÄÚ´æ½øÐÐд²Ù×÷£©ÊÇһЩ³£¼ûµÄÎÊÌ⣬ËüÃÇ¿ÉÄܺÜÄѼì²âµ½¡£ÕâÒ»²¿·Ö½«ÌÖÂÛ¼¸¸öµ÷ÊÔ¹¤¾ß£¬ËüÃǼ«´óµØ¼ò»¯Á˼ì²âºÍÕÒ³öÄÚ´æÎÊÌâµÄ¹ý³Ì¡£

¡¡¡¡MEMWATCH

¡¡¡¡MEMWATCH ÓÉ Johan Lindh ±àд£¬ÊÇÒ»¸ö¿ª·ÅÔ´´úÂë C ÓïÑÔÄÚ´æ´íÎó¼ì²â¹¤¾ß£¬Äú¿ÉÒÔ×Ô¼ºÏÂÔØËü£¨Çë²ÎÔı¾ÎĺóÃæ²¿·ÖµÄ²Î¿¼×ÊÁÏ£©¡£Ö»ÒªÔÚ´úÂëÖÐÌí¼ÓÒ»¸öÍ·Îļþ²¢ÔÚ gcc Óï¾äÖж¨ÒåÁË MEMWATCH Ö®ºó£¬Äú¾Í¿ÉÒÔ¸ú×Ù³ÌÐòÖеÄÄÚ´æÐ¹Â©ºÍ´íÎóÁË¡£MEMWATCH Ö§³Ö ANSI C£¬ËüÌṩ½á¹ûÈÕÖ¾¼Í¼£¬Äܼì²âË«ÖØÊÍ·Å£¨double-free£©¡¢´íÎóÊÍ·Å£¨erroneous free£©¡¢Ã»ÓÐÊͷŵÄÄڴ棨unfreed memory£©¡¢Òç³öºÍÏÂÒçµÈµÈ¡£

Çåµ¥ 1. ÄÚ´æÑù±¾£¨test1.c£©
[code]#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);
}[/code]

¡¡¡¡Çåµ¥ 1 ÖеĴúÂ뽫·ÖÅäÁ½¸ö 512 ×Ö½ÚµÄÄÚ´æ¿é£¬È»ºóÖ¸ÏòµÚÒ»¸öÄÚ´æ¿éµÄÖ¸Õë±»É趨ΪָÏòµÚ¶þ¸öÄÚ´æ¿é¡£½á¹û£¬µÚ¶þ¸öÄÚ´æ¿éµÄµØÖ·¶ªÊ§£¬´Ó¶ø²úÉúÁËÄÚ´æÐ¹Â©¡£

¡¡¡¡ÏÖÔÚÎÒÃDZàÒëÇåµ¥ 1 µÄ memwatch.c¡£ÏÂÃæÊÇÒ»¸ö makefile ʾÀý£º

[code]test1
gcc -DMEMWATCH -DMW_STDIO test1.c memwatch
c -o test1[/code]

¡¡¡¡µ±ÄúÔËÐÐ test1 ³ÌÐòºó£¬Ëü»áÉú³ÉÒ»¸ö¹ØÓÚй©µÄÄÚ´æµÄ±¨¸æ¡£Çåµ¥ 2 չʾÁËʾÀý memwatch.log Êä³öÎļþ¡£

Çåµ¥ 2. test1 memwatch.log Îļþ
[code]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[/code]

¡¡¡¡MEMWATCH ΪÄúÏÔÊ¾ÕæÕýµ¼ÖÂÎÊÌâµÄÐС£Èç¹ûÄúÊÍ·ÅÒ»¸öÒѾ­ÊͷŹýµÄÖ¸Õ룬Ëü»á¸æËßÄú¡£¶ÔÓÚûÓÐÊͷŵÄÄÚ´æÒ²Ò»Ñù¡£ÈÕÖ¾½áβ²¿·ÖÏÔʾͳ¼ÆÐÅÏ¢£¬°üÀ¨Ð¹Â©Á˶àÉÙÄڴ棬ʹÓÃÁ˶àÉÙÄڴ棬ÒÔ¼°×ܹ²·ÖÅäÁ˶àÉÙÄÚ´æ¡£

¡¡¡¡YAMD

¡¡¡¡YAMD Èí¼þ°üÓÉ Nate Eldredge ±àд£¬¿ÉÒÔ²éÕÒ C ºÍ C++ Öж¯Ì¬µÄ¡¢ÓëÄÚ´æ·ÖÅäÓйصÄÎÊÌâ¡£ÔÚ׫д±¾ÎÄʱ£¬YAMD µÄ×îа汾Ϊ 0.32¡£ÇëÏÂÔØ yamd-0.32.tar.gz£¨Çë²ÎÔIJο¼×ÊÁÏ£©¡£Ö´ÐÐ make ÃüÁîÀ´¹¹½¨³ÌÐò£»È»ºóÖ´ÐÐ make install ÃüÁî°²×°³ÌÐò²¢ÉèÖù¤¾ß¡£

¡¡¡¡Ò»µ©ÄúÏÂÔØÁË YAMD Ö®ºó£¬ÇëÔÚ test1.c ÉÏʹÓÃËü¡£Çëɾ³ý #include memwatch.h ²¢¶Ô makefile ½øÐÐÈçÏÂССµÄÐ޸ģº

ʹÓà YAMD µÄ test1
[code]gcc -g test1.c -o test1[/code]

Çåµ¥ 3 չʾÁËÀ´×Ô test1 É쵀 YAMD µÄÊä³ö¡£

Çåµ¥ 3. ʹÓà YAMD µÄ test1 Êä³ö
[code]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.[/code]

¡¡¡¡YAMD ÏÔʾÎÒÃÇÒѾ­ÊÍ·ÅÁËÄڴ棬¶øÇÒ´æÔÚÄÚ´æÐ¹Â©¡£ÈÃÎÒÃÇÔÚÇåµ¥ 4 ÖÐÁíÒ»¸öÑù±¾³ÌÐòÉÏÊÔÊÔ YAMD¡£

Çåµ¥ 4. ÄÚ´æ´úÂ루test2.c£©
[code]#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 = 'S';
}
ptr2 = ptr1;
free(ptr2);
free(ptr1);
free(chptr);
}[/code]

¡¡¡¡Äú¿ÉÒÔʹÓÃÏÂÃæµÄÃüÁîÀ´Æô¶¯ YAMD£º

[code]./run-yamd /usr/src/test/test2/test2[/code]
¡¡¡¡Çåµ¥ 5 ÏÔʾÁËÔÚÑù±¾³ÌÐò test2 ÉÏʹÓà YAMD µÃµ½µÄÊä³ö¡£YAMD ¸æËßÎÒÃÇÔÚ for Ñ­»·ÖÐÓС°Ô½½ç£¨out-of-bounds£©¡±µÄÇé¿ö¡£

Çåµ¥ 5. ʹÓà YAMD µÄ test2 Êä³ö
[code]Running /usr/src/test/test2/test2
Temp output to /tmp/yamd-out.1243
*********
./run-yamd: line 101: 1248 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.[/code]

¡¡¡¡MEMWATCH ºÍ YAMD ¶¼ÊǺÜÓÐÓõĵ÷ÊÔ¹¤¾ß£¬ËüÃǵÄʹÓ÷½·¨ÓÐËù²»Í¬¡£¶ÔÓÚ MEMWATCH£¬ÄúÐèÒªÌí¼Ó°üº¬Îļþ memwatch.h ²¢´ò¿ªÁ½¸ö±àÒëʱ¼ä±ê¼Ç¡£¶ÔÓÚÁ´½Ó£¨link£©Óï¾ä£¬YAMD Ö»ÐèÒª -g Ñ¡Ïî¡£

¡¡¡¡Electric Fence

¡¡¡¡¶àÊý Linux ·Ö·¢°æ°üº¬Ò»¸ö Electric Fence °ü£¬²»¹ýÄúÒ²¿ÉÒÔÑ¡ÔñÏÂÔØËü¡£Electric Fence ÊÇÒ»¸öÓÉ Bruce Perens ±àдµÄ malloc() µ÷ÊÔ¿â¡£Ëü¾ÍÔÚÄú·ÖÅäÄÚ´æºó·ÖÅäÊܱ£»¤µÄÄÚ´æ¡£Èç¹û´æÔÚ fencepost ´íÎ󣨳¬¹ýÊý×éĩβÔËÐУ©£¬³ÌÐò¾Í»á²úÉú±£»¤´íÎ󣬲¢Á¢¼´½áÊø¡£Í¨¹ý½áºÏ Electric Fence ºÍ gdb£¬Äú¿ÉÒÔ¾«È·µØ¸ú×Ùµ½ÄÄÒ»ÐÐÊÔͼ·ÃÎÊÊܱ£»¤ÄÚ´æ¡£Electric Fence µÄÁíÒ»¸ö¹¦ÄܾÍÊÇÄܹ»¼ì²âÄÚ´æÐ¹Â©¡£

¡¡¡¡µÚ 2 ÖÖÇé¿ö£ºÊ¹Óà strace

¡¡¡¡strace ÃüÁîÊÇÒ»ÖÖÇ¿´óµÄ¹¤¾ß£¬ËüÄܹ»ÏÔʾËùÓÐÓÉÓû§¿Õ¼ä³ÌÐò·¢³öµÄϵͳµ÷Óá£strace ÏÔʾÕâЩµ÷ÓõIJÎÊý²¢·µ»Ø·ûºÅÐÎʽµÄÖµ¡£strace ´ÓÄں˽ÓÊÕÐÅÏ¢£¬¶øÇÒ²»ÐèÒªÒÔÈκÎÌØÊâµÄ·½Ê½À´¹¹½¨Äںˡ£½«¸ú×ÙÐÅÏ¢·¢Ë͵½Ó¦ÓóÌÐò¼°Äں˿ª·¢Õß¶¼ºÜÓÐÓá£ÔÚÇåµ¥ 6 ÖУ¬·ÖÇøµÄÒ»ÖÖ¸ñʽÓдíÎó£¬Çåµ¥ÏÔʾÁË strace µÄ¿ªÍ·²¿·Ö£¬ÄÚÈÝÊǹØÓÚµ÷³ö´´½¨Îļþϵͳ²Ù×÷£¨mkfs£©µÄ¡£strace È·¶¨Äĸöµ÷Óõ¼ÖÂÎÊÌâ³öÏÖ¡£

Çåµ¥ 6. mkfs ÉÏ strace µÄ¿ªÍ·²¿·Ö
[code]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(63, 255), ...}) = 0
ioctl(4, 0x40041271, 0xbfffe128) = -1 EINVAL (Invalid argument)
write(2, "mkfs.jfs: warning - cannot setb" ..., 98mkfs.jfs: warning -
cannot set blocksize on block device /dev/test1: Invalid argument )
= 98
stat64("/dev/test1", {st_mode=&, st_rdev=makedev(63, 255), ...}) = 0
open("/dev/test1", O_RDONLY|O_LARGEFILE) = 5
ioctl(5, 0x80041272, 0xbfffe124) = -1 EINVAL (Invalid argument)
write(2, "mkfs.jfs: can\'t determine device"..., ..._exit(1)
= ?[/code]

¡¡¡¡Çåµ¥ 6 ÏÔʾ ioctl µ÷Óõ¼ÖÂÓÃÀ´¸ñʽ»¯·ÖÇøµÄ mkfs ³ÌÐòʧ°Ü¡£ioctl BLKGETSIZE64 ʧ°Ü¡££¨BLKGET-SIZE64 ÔÚµ÷Óà ioctl µÄÔ´´úÂëÖж¨Òå¡£) BLKGETSIZE64 ioctl ½«±»Ìí¼Óµ½ Linux ÖÐËùÓеÄÉ豸£¬¶øÔÚÕâÀÂß¼­¾í¹ÜÀíÆ÷»¹²»Ö§³ÖËü¡£Òò´Ë£¬Èç¹û BLKGETSIZE64 ioctl µ÷ÓÃʧ°Ü£¬mkfs ´úÂ뽫¸ÄΪµ÷ÓýÏÔçµÄ ioctl µ÷Óã»ÕâʹµÃ mkfs ÊÊÓÃÓÚÂß¼­¾í¹ÜÀíÆ÷¡£

¡¡¡¡µÚ 3 ÖÖÇé¿ö£ºÊ¹Óà gdb ºÍ Oops

¡¡¡¡Äú¿ÉÒÔ´ÓÃüÁîÐÐʹÓà gdb ³ÌÐò£¨Free Software Foundation µÄµ÷ÊÔÆ÷£©À´ÕÒ³ö´íÎó£¬Ò²¿ÉÒÔ´ÓÖîÈç Data Display Debugger£¨DDD£©ÕâÑùµÄ¼¸¸öͼÐι¤¾ß֮һʹÓà gdb ³ÌÐòÀ´ÕÒ³ö´íÎó¡£Äú¿ÉÒÔʹÓà gdb À´µ÷ÊÔÓû§¿Õ¼ä³ÌÐò»ò Linux Äںˡ£ÕâÒ»²¿·ÖÖ»ÌÖÂÛ´ÓÃüÁîÐÐÔËÐÐ gdb µÄÇé¿ö¡£

¡¡¡¡Ê¹Óà gdb program name ÃüÁîÆô¶¯ gdb¡£gdb ½«ÔØÈë¿ÉÖ´ÐгÌÐò·ûºÅ²¢ÏÔʾÊäÈëÌáʾ·û£¬ÈÃÄú¿ÉÒÔ¿ªÊ¼Ê¹Óõ÷ÊÔÆ÷¡£Äú¿ÉÒÔͨ¹ýÈýÖÖ·½Ê½Óà gdb ²é¿´½ø³Ì£º

¡¡¡¡Ê¹Óà attach ÃüÁʼ²é¿´Ò»¸öÒѾ­ÔËÐеĽø³Ì£»attach ½«Í£Ö¹½ø³Ì¡£

¡¡¡¡Ê¹Óà run ÃüÁîÖ´ÐгÌÐò²¢´ÓÍ·¿ªÊ¼µ÷ÊÔ³ÌÐò¡£

¡¡¡¡²é¿´ÒÑÓеĺËÐÄÎļþÀ´È·¶¨½ø³ÌÖÕֹʱµÄ״̬¡£Òª²é¿´ºËÐÄÎļþ£¬ÇëÓÃÏÂÃæµÄÃüÁîÆô¶¯ gdb¡£
[code]gdb programname corefilename[/code]
¡¡¡¡ÒªÓúËÐÄÎļþ½øÐе÷ÊÔ£¬Äú²»½öÐèÒª³ÌÐòµÄ¿ÉÖ´ÐÐÎļþºÍÔ´Îļþ£¬»¹ÐèÒªºËÐÄÎļþ±¾Éí¡£ÒªÓúËÐÄÎļþÆô¶¯ gdb£¬ÇëʹÓà -c Ñ¡Ï

[code]gdb -c core programname[/code]

¡¡¡¡gdb ÏÔʾÄÄÐдúÂëµ¼Ö³ÌÐò·¢ÉúºËÐÄת´¢¡£

¡¡¡¡ÔÚÔËÐгÌÐò»òÁ¬½Óµ½ÒѾ­ÔËÐеijÌÐò֮ǰ£¬ÇëÁгöÄú¾õµÃÓдíÎóµÄÔ´´úÂ룬ÉèÖöϵ㣬Ȼºó¿ªÊ¼µ÷ÊÔ³ÌÐò¡£Äú¿ÉÒÔʹÓà help ÃüÁî²é¿´È«ÃæµÄ gdb ÔÚÏß°ïÖúºÍÏêϸµÄ½Ì³Ì¡£

¡¡¡¡kgdb

¡¡¡¡kgdb ³ÌÐò£¨Ê¹Óà gdb µÄÔ¶³ÌÖ÷»ú Linux Äں˵÷ÊÔÆ÷£©ÌṩÁËÒ»ÖÖʹÓà gdb µ÷ÊÔ Linux Äں˵ĻúÖÆ¡£kgdb ³ÌÐòÊÇÄں˵ÄÀ©Õ¹£¬ËüÈÃÄúÄܹ»ÔÚÔ¶³ÌÖ÷»úÉÏÔËÐÐ gdb ʱÁ¬½Óµ½ÔËÐÐÓà kgdb À©Õ¹µÄÄں˻úÆ÷¡£Äú¿ÉÒÔ½Ó×ÅÉîÈëµ½ÄÚºËÖС¢ÉèÖöϵ㡢¼ì²éÊý¾Ý²¢½øÐÐÆäËü²Ù×÷£¨ÀàËÆÓÚÄúÔÚÓ¦ÓóÌÐòÉÏʹÓà gdb µÄ·½Ê½£©¡£Õâ¸ö²¹¶¡µÄÖ÷ÒªÌØµãÖ®Ò»¾ÍÊÇÔËÐÐ gdb µÄÖ÷»úÔÚÒýµ¼¹ý³ÌÖÐÁ¬½Óµ½Ä¿±ê»úÆ÷£¨ÔËÐÐÒª±»µ÷ÊÔµÄÄںˣ©¡£ÕâÈÃÄúÄܹ»¾¡Ô翪ʼµ÷ÊÔ¡£Çë×¢Ò⣬²¹¶¡Îª Linux ÄÚºËÌí¼ÓÁ˹¦ÄÜ£¬ËùÒÔ gdb ¿ÉÒÔÓÃÀ´µ÷ÊÔ Linux Äںˡ£

¡¡¡¡Ê¹Óà kgdb ÐèÒªÁ½Ì¨»úÆ÷£ºÒ»Ì¨ÊÇ¿ª·¢»úÆ÷£¬Áíһ̨ÊDzâÊÔ»úÆ÷¡£Ò»Ìõ´®ÐÐÏߣ¨¿Õµ÷ÖÆ½âµ÷Æ÷µçÀ£©½«Í¨¹ý»úÆ÷µÄ´®¿ÚÁ¬½ÓËüÃÇ¡£ÄúÏ£Íûµ÷ÊÔµÄÄÚºËÔÚ²âÊÔ»úÆ÷ÉÏÔËÐУ»gdb ÔÚ¿ª·¢»úÆ÷ÉÏÔËÐС£gdb ʹÓô®ÐÐÏßÓëÄúÒªµ÷ÊÔµÄÄÚºËͨÐÅ¡£

¡¡¡¡Çë×ñÑ­ÏÂÃæµÄ²½ÖèÀ´ÉèÖà kgdb µ÷ÊÔ»·¾³£º

¡¡¡¡ÏÂÔØÄúµÄ Linux Äں˰汾ÊÊÓõIJ¹¶¡¡£

¡¡¡¡½«×é¼þ¹¹½¨µ½Äںˣ¬ÒòΪÕâÊÇʹÓà kgdb ×î¼òµ¥µÄ·½·¨¡££¨Çë×¢Ò⣬ÓÐÁ½ÖÖ·½·¨¿ÉÒÔ¹¹½¨¶àÊýÄÚºË×é¼þ£¬±ÈÈç×÷Ϊģ¿é»òÖ±½Ó¹¹½¨µ½ÄÚºËÖС£¾ÙÀýÀ´Ëµ£¬ÈÕÖ¾¼Í¼Îļþϵͳ£¨Journaled File System£¬JFS£©¿ÉÒÔ×÷Ϊģ¿é¹¹½¨£¬»òÖ±½Ó¹¹½¨µ½ÄÚºËÖС£Í¨¹ýʹÓà gdb ²¹¶¡£¬ÎÒÃǾͿÉÒÔ½« JFS Ö±½Ó¹¹½¨µ½ÄÚºËÖС££©

¡¡¡¡Ó¦ÓÃÄں˲¹¶¡²¢ÖØÐ¹¹½¨Äںˡ£

¡¡¡¡´´½¨Ò»¸öÃûΪ .gdbinit µÄÎļþ£¬²¢½«Æä±£´æÔÚÄÚºËÔ´Îļþ×ÓĿ¼ÖУ¨»»¾ä»°Ëµ¾ÍÊÇ /usr/src/linux£©¡£Îļþ .gdbinit ÖÐÓÐÏÂÃæËÄÐдúÂ룺
[code]set remotebaud 115200
symbol-file vmlinux
target remote /dev/ttyS0
set output-radix 16[/code]

¡¡¡¡½« append=gdb ÕâÒ»ÐÐÌí¼Óµ½ lilo£¬lilo ÊÇÓÃÀ´ÔÚÒýµ¼ÄÚºËʱѡÔñʹÓÃÄĸöÄں˵ÄÒýµ¼ÔØÈë³ÌÐò¡£
[code]image=/boot/bzImage-2.4.17
label=gdb2417
read-only
root=/dev/sda8
append="gdb gdbttyS=1 gdb-baud=115200 nmi_watchdog=0"[/code]

Çåµ¥ 7 ÊÇÒ»¸ö½Å±¾Ê¾Àý£¬Ëü½«ÄúÔÚ¿ª·¢»úÆ÷ÉϹ¹½¨µÄÄں˺ÍÄ£¿éÒýÈë²âÊÔ»úÆ÷¡£ÄúÐèÒªÐÞ¸ÄÏÂÃæ¼¸Ï

[code]best@sfb£ºÓû§±êʶºÍ»úÆ÷Ãû¡£
/usr/src/linux-2.4.17£ºÄÚºËÔ´´úÂëÊ÷µÄĿ¼¡£
bzImage-2.4.17£º²âÊÔ»úÆ÷ÉϽ«Òýµ¼µÄÄÚºËÃû¡£
rcp ºÍ rsync£º±ØÐëÔÊÐíËüÔÚ¹¹½¨Äں˵ĻúÆ÷ÉÏÔËÐС£[/code]

Çåµ¥ 7. ÒýÈë²âÊÔ»úÆ÷µÄÄں˺ÍÄ£¿éµÄ½Å±¾
[code]set -x
rcp best@sfb: /usr/src/linux-2.4.17/arch/i386/boot/bzImage /boot/bzImage-2.4.17
rcp best@sfb:/usr/src/linux-2.4.17/System.map /boot/System.map-2.4.17
rm -rf /lib/modules/2.4.17
rsync -a best@sfb:/lib/modules/2.4.17 /lib/modules
chown -R root /lib/modules/2.4.17
lilo[/code]

¡¡¡¡ÏÖÔÚÎÒÃÇ¿ÉÒÔͨ¹ý¸ÄΪʹÓÃÄÚºËÔ´´úÂëÊ÷¿ªÊ¼µÄĿ¼À´Æô¶¯¿ª·¢»úÆ÷É쵀 gdb ³ÌÐòÁË¡£ÔÚ±¾Ê¾ÀýÖУ¬ÄÚºËÔ´´úÂëÊ÷λÓÚ /usr/src/linux-2.4.17¡£ÊäÈë gdb Æô¶¯³ÌÐò¡£

¡¡¡¡Èç¹ûÒ»ÇÐÕý³££¬²âÊÔ»úÆ÷½«ÔÚÆô¶¯¹ý³ÌÖÐÍ£Ö¹¡£ÊäÈë gdb ÃüÁî cont ÒÔ¼ÌÐøÆô¶¯¹ý³Ì¡£Ò»¸ö³£¼ûµÄÎÊÌâÊÇ£¬¿Õµ÷ÖÆ½âµ÷Æ÷µçÀ¿ÉÄܻᱻÁ¬½Óµ½´íÎóµÄ´®¿Ú¡£Èç¹û gdb ²»Æô¶¯£¬½«¶Ë¿Ú¸ÄΪµÚ¶þ¸ö´®¿Ú£¬Õâ»áʹ gdb Æô¶¯¡£

¡¡¡¡Ê¹Óà kgdb µ÷ÊÔÄÚºËÎÊÌâ

¡¡¡¡Çåµ¥ 8 ÁгöÁË jfs_mount.c ÎļþµÄÔ´´úÂëÖб»Ð޸ĹýµÄ´úÂ룬ÎÒÃÇÔÚ´úÂëÖд´½¨ÁËÒ»¸ö¿ÕÖ¸ÕëÒì³££¬´Ó¶øÊ¹´úÂëÔÚµÚ 109 ÐвúÉú¶Î´íÎó¡£

Çåµ¥ 8. Ð޸ĹýºóµÄ jfs_mount.c ´úÂë
[code]int jfs_mount(struct super_block *sb)
{
...
int ptr; /* line 1 added */
jFYI(1, ("\nMount JFS\n"));
/ *
* read/validate superblock
* (initialize mount inode from the superblock)
* /
if ((rc = chkSuper(sb))) {
goto errout20;
}
108 ptr=0; /* line 2 added */
109 printk("%d\n",*ptr); /* line 3 added */[/code]

¡¡¡¡Çåµ¥ 9 ÔÚÏòÎļþϵͳ·¢³ö mount ÃüÁîÖ®ºóÏÔʾһ¸ö gdb Òì³£¡£kgdb ÌṩÁ˼¸ÌõÃüÁÈçÏÔʾÊý¾Ý½á¹¹ºÍ±äÁ¿ÖµÒÔ¼°ÏÔʾϵͳÖеÄËùÓÐÈÎÎñ´¦ÓÚʲô״̬¡¢ËüÃÇפÁôÔںδ¦¡¢ËüÃÇÔÚÄÄЩµØ·½Ê¹ÓÃÁË CPU µÈµÈ¡£Çåµ¥ 9 ½«ÏÔʾ»ØËݸú×ÙΪ¸ÃÎÊÌâÌṩµÄÐÅÏ¢£»where ÃüÁîÓÃÀ´Ö´Ðз´¸ú×Ù£¬Ëü½«¸æËß±»Ö´Ðеĵ÷ÓÃÔÚ´úÂëÖеÄʲôµØ·½Í£Ö¹¡£

Çåµ¥ 9. gdb Òì³£ºÍ·´¸ú×Ù
[code]mount -t jfs /dev/sdb /jfs

Program received signal SIGSEGV, Segmentation fault.
jfs_mount (sb=0xf78a3800) at jfs_mount.c:109
109 printk("%d\n",*ptr);
(gdb)where
#0 jfs_mount (sb=0xf78a3800) at jfs_mount.c:109
#1 0xc01a0dbb in jfs_read_super ... at super.c:280
#2 0xc0149ff5 in get_sb_bdev ... at super.c:620
#3 0xc014a89f in do_kern_mount ... at super.c:849
#4 0xc0160e66 in do_add_mount ... at namespace.c:569
#5 0xc01610f4 in do_mount ... at namespace.c:683
#6 0xc01611ea in sys_mount ... at namespace.c:716
#7 0xc01074a7 in system_call () at af_packet.c:1891
#8 0x0 in ?? ()
(gdb)[/code]

¡¡¡¡ÏÂÒ»²¿·Ö»¹½«ÌÖÂÛÕâ¸öÏàͬµÄ JFS ¶Î´íÎóÎÊÌ⣬µ«²»ÉèÖõ÷ÊÔÆ÷£¬Èç¹ûÄúÔÚ·Ç kgdb Äں˻·¾³ÖÐÖ´ÐÐÇåµ¥ 8 ÖеĴúÂ룬ÄÇôËüʹÓÃÄں˿ÉÄÜÉú³ÉµÄ Oops ÏûÏ¢¡£

¡¡¡¡Oops ·ÖÎö

¡¡¡¡Oops£¨Ò²³Æ panic£¬»ÅÕÅ£©ÏûÏ¢°üº¬ÏµÍ³´íÎóµÄϸ½Ú£¬Èç CPU ¼Ä´æÆ÷µÄÄÚÈÝ¡£ÔÚ Linux ÖУ¬µ÷ÊÔϵͳ±ÀÀ£µÄ´«Í³·½·¨ÊÇ·ÖÎöÔÚ·¢Éú±ÀÀ£Ê±·¢Ë͵½ÏµÍ³¿ØÖÆÌ¨µÄ Oops ÏûÏ¢¡£Ò»µ©ÄúÕÆÎÕÁËϸ½Ú£¬¾Í¿ÉÒÔ½«ÏûÏ¢·¢Ë͵½ ksymoops ʵÓóÌÐò£¬Ëü½«ÊÔͼ½«´úÂëת»»ÎªÖ¸Áî²¢½«¶ÑÕ»ÖµÓ³Éäµ½Äں˷ûºÅ¡£ÔںܶàÇé¿öÏ£¬ÕâЩÐÅÏ¢¾Í×ã¹»ÄúÈ·¶¨´íÎóµÄ¿ÉÄÜÔ­ÒòÊÇʲôÁË¡£Çë×¢Ò⣬Oops ÏûÏ¢²¢²»°üÀ¨ºËÐÄÎļþ¡£

¡¡¡¡ÈÃÎÒÃǼÙÉèϵͳ¸Õ¸Õ´´½¨ÁËÒ»Ìõ Oops ÏûÏ¢¡£×÷Ϊ±àд´úÂëµÄÈË£¬ÄúÏ£Íû½â¾öÎÊÌⲢȷ¶¨Ê²Ã´µ¼ÖÂÁË Oops ÏûÏ¢µÄ²úÉú£¬»òÕßÄúÏ£ÍûÏòÏÔʾÁË Oops ÏûÏ¢µÄ´úÂëµÄ¿ª·¢ÕßÌṩÓйØÄúµÄÎÊÌâµÄ´ó²¿·ÖÐÅÏ¢£¬´Ó¶ø¼°Ê±µØ½â¾öÎÊÌâ¡£Oops ÏûÏ¢ÊǵÈʽµÄÒ»²¿·Ö£¬µ«Èç¹û²»Í¨¹ý ksymoops ³ÌÐòÔËÐÐËüÒ²ÓÚÊÂÎÞ²¹¡£ÏÂÃæµÄͼÏÔʾÁ˸ñʽ»¯ Oops ÏûÏ¢µÄ¹ý³Ì¡£

¡¡¡¡¸ñʽ»¯ Oops ÏûÏ¢

¡¡¡¡ksymoops ÐèÒª¼¸ÏîÄÚÈÝ£ºOops ÏûÏ¢Êä³ö¡¢À´×ÔÕýÔÚÔËÐеÄÄÚºËµÄ System.map Îļþ£¬»¹ÓÐ /proc/ksyms¡¢vmlinux ºÍ /proc/modules¡£¹ØÓÚÈçºÎʹÓà ksymoops£¬ÄÚºËÔ´´úÂë /usr/src/linux/Documentation/oops-tracing.txt Öлò ksymoops ÊÖ²áÒ³ÉÏÓÐÍêÕûµÄ˵Ã÷¿ÉÒԲο¼¡£Ksymoops ·´»ã±à´úÂ벿·Ö£¬Ö¸³ö·¢Éú´íÎóµÄÖ¸Á²¢ÏÔʾһ¸ö¸ú×Ù²¿·Ö±íÃ÷´úÂëÈçºÎ±»µ÷Óá£

¡¡¡¡Ê×ÏÈ£¬½« Oops ÏûÏ¢±£´æÔÚÒ»¸öÎļþÖÐÒÔ±ãͨ¹ý ksymoops ʵÓóÌÐòÔËÐÐËü¡£Çåµ¥ 10 ÏÔʾÁËÓɰ²×° JFS ÎļþϵͳµÄ mount ÃüÁî´´½¨µÄ Oops ÏûÏ¢£¬ÎÊÌâÊÇÓÉÇåµ¥ 8 ÖÐÌí¼Óµ½ JFS °²×°´úÂëµÄÄÇÈýÐдúÂë²úÉúµÄ¡£

Çåµ¥ 10. ksymoops ´¦ÀíºóµÄ Oops ÏûÏ¢
[code]ksymoops 2.4.0 on i686 2.4.17. Options used
... 15:59:37 sfb1 kernel: Unable to handle kernel NULL pointer dereference at
virtual address 0000000
... 15:59:37 sfb1 kernel: c01588fc
... 15:59:37 sfb1 kernel: *pde = 0000000
... 15:59:37 sfb1 kernel: Oops: 0000
... 15:59:37 sfb1 kernel: CPU: 0
... 15:59:37 sfb1 kernel: EIP: 0010:[jfs_mount+60/704]

... 15:59:37 sfb1 kernel: Call Trace: [jfs_read_super+287/688]
[get_sb_bdev+563/736] [do_kern_mount+189/336] [do_add_mount+35/208]
[do_page_fault+0/1264]
... 15:59:37 sfb1 kernel: Call Trace: []...
... 15:59:37 sfb1 kernel: [>EIP; c01588fc <=====
...
Trace; c0106cf3
Code; c01588fc
00000000 <_EIP>:
Code; c01588fc <=====
0: 8b 2d 00 00 00 00 mov 0x0,%ebp <=====
Code; c0158902
6: 55 push %ebp[/code]

¡¡¡¡½ÓÏÂÀ´£¬ÄúҪȷ¶¨ jfs_mount ÖеÄÄÄÒ»ÐдúÂëÒýÆðÁËÕâ¸öÎÊÌâ¡£Oops ÏûÏ¢¸æËßÎÒÃÇÎÊÌâÊÇÓÉλÓÚÆ«ÒƵØÖ· 3c µÄÖ¸ÁîÒýÆðµÄ¡£×öÕâ¼þʵİ취֮һÊÇ¶Ô jfs_mount.o ÎļþʹÓà objdump ʵÓóÌÐò£¬È»ºó²é¿´Æ«ÒƵØÖ· 3c¡£Objdump ÓÃÀ´·´»ã±àÄ£¿éº¯Êý£¬¿´¿´ÄúµÄ C Ô´´úÂë»á²úÉúʲô»ã±àÖ¸Áî¡£Çåµ¥ 11 ÏÔʾÁËʹÓà objdump ºóÄú½«¿´µ½µÄÄÚÈÝ£¬½Ó×Å£¬ÎÒÃDz鿴 jfs_mount µÄ C ´úÂ룬¿ÉÒÔ¿´µ½¿ÕÖµÊÇµÚ 109 ÐÐÒýÆðµÄ¡£Æ«ÒƵØÖ· 3c Ö®ËùÒÔºÜÖØÒª£¬ÊÇÒòΪ Oops ÏûÏ¢½«¸Ã´¦±êʶΪÒýÆðÎÊÌâµÄλÖá£

Çåµ¥ 11. jfs_mount µÄ»ã±à³ÌÐòÇåµ¥
[code]109 printk("%d\n",*ptr);

objdump jfs_mount.o

jfs_mount.o: file format elf32-i386

Disassembly of section .text:

00000000 :
0:55 push %ebp
...
2c: e8 cf 03 00 00 call 400
31: 89 c3 mov %eax,%ebx
33: 58 pop %eax
34: 85 db test %ebx,%ebx
36: 0f 85 55 02 00 00 jne 291
3c: 8b 2d 00 00 00 00 mov 0x0,%ebp << problem line above
42: 55 push %ebp[/code]

¡¡¡¡kdb

¡¡¡¡Linux Äں˵÷ÊÔÆ÷£¨Linux kernel debugger£¬kdb£©ÊÇ Linux Äں˵IJ¹¶¡£¬ËüÌṩÁËÒ»ÖÖÔÚϵͳÄÜÔËÐÐʱ¶ÔÄÚºËÄÚ´æºÍÊý¾Ý½á¹¹½øÐмì²éµÄ°ì·¨¡£Çë×¢Ò⣬kdb ²»ÐèÒªÁ½Ì¨»úÆ÷£¬²»¹ýËüÒ²²»ÔÊÐíÄúÏñ kgdb ÄÇÑù½øÐÐÔ´´úÂë¼¶±ðÉϵĵ÷ÊÔ¡£Äú¿ÉÒÔÌí¼Ó¶îÍâµÄÃüÁ¸ø³ö¸ÃÊý¾Ý½á¹¹µÄ±êʶ»òµØÖ·£¬ÕâЩÃüÁî±ã¿ÉÒÔ¸ñʽ»¯ºÍÏÔʾ»ù±¾µÄϵͳÊý¾Ý½á¹¹¡£Ä¿Ç°µÄÃüÁÔÊÐíÄú¿ØÖưüÀ¨ÒÔϲÙ×÷ÔÚÄÚµÄÄں˲Ù×÷£º

¡¡¡¡´¦ÀíÆ÷µ¥²½Ö´ÐÐ
¡¡¡¡Ö´Ðе½Ä³ÌõÌØ¶¨Ö¸Áîʱֹͣ
¡¡¡¡µ±´æÈ¡£¨»òÐ޸ģ©Ä³¸öÌØ¶¨µÄÐéÄâÄÚ´æÎ»ÖÃʱֹͣ
¡¡¡¡µ±´æÈ¡ÊäÈ룯Êä³öµØÖ·¿Õ¼äÖеļĴæÆ÷ʱֹͣ
¡¡¡¡¶Ôµ±Ç°»î¶¯µÄÈÎÎñºÍËùÓÐÆäËüÈÎÎñ½øÐжÑÕ»»ØËݸú×Ù£¨Í¨¹ý½ø³Ì ID£©
¡¡¡¡¶ÔÖ¸Áî½øÐз´»ã±à

¡¡¡¡×·»÷ÄÚ´æÒç³ö

¡¡¡¡Äú¿Ï¶¨²»ÏëÏÝÈëÀàËÆÔÚ¼¸Ç§´Îµ÷ÓÃÖ®ºó·¢Éú·ÖÅäÒç³öÕâÑùµÄÇéÐΡ£

¡¡¡¡ÎÒÃǵÄС×黨ÁËÐíÐí¶à¶àʱ¼äÀ´¸ú×ÙÏ¡Ææ¹Å¹ÖµÄÄÚ´æ´íÎóÎÊÌâ¡£Ó¦ÓóÌÐòÔÚÎÒÃǵĿª·¢¹¤×÷Õ¾ÉÏÄÜÔËÐУ¬µ«ÔÚеIJúÆ·¹¤×÷Õ¾ÉÏ£¬Õâ¸öÓ¦ÓóÌÐòÔÚµ÷Óà malloc() Á½°ÙÍò´ÎÖ®ºó¾Í²»ÄÜÔËÐÐÁË¡£ÕæÕýµÄÎÊÌâÊÇÔÚ´óÔ¼Ò»°ÙÍò´Îµ÷ÓÃÖ®ºó·¢ÉúÁËÒç³ö¡£ÐÂϵͳ֮ËùÓдæÔÚÕâ¸öÎÊÌ⣬ÊÇÒòΪ±»±£ÁôµÄ malloc() ÇøÓòµÄ²¼¾ÖÓÐËù²»Í¬£¬´Ó¶øÕâЩÁãÉ¢ÄÚ´æ±»·ÅÖÃÔÚÁ˲»Í¬µÄµØ·½£¬ÔÚ·¢ÉúÒç³öÊ±ÆÆ»µÁËһЩ²»Í¬µÄÄÚÈÝ¡£

¡¡¡¡ÎÒÃÇÓöàÖÖ²»Í¬¼¼ÊõÀ´½â¾öÕâ¸öÎÊÌ⣬ÆäÖÐÒ»ÖÖÊÇʹÓõ÷ÊÔÆ÷£¬ÁíÒ»ÖÖÊÇÔÚÔ´´úÂëÖÐÌí¼Ó¸ú×Ù¹¦ÄÜ¡£ÔÚÎÒÖ°ÒµÉúÑĵĴó¸ÅÒ²ÊÇÕâ¸öʱºò£¬Îұ㿪ʼ¹Ø×¢ÄÚ´æµ÷ÊÔ¹¤¾ß£¬Ï£ÍûÄܸü¿ì¸üÓÐЧµØ½â¾öÕâЩÀàÐ͵ÄÎÊÌâ¡£ÔÚ¿ªÊ¼Ò»¸öÐÂÏîĿʱ£¬ÎÒ×îÏÈ×öµÄÊÂÇéÖ®Ò»¾ÍÊÇÔËÐÐ MEMWATCH ºÍ YAMD£¬¿´¿´ËüÃÇÊDz»ÊÇ»áÖ¸³öÄÚ´æ¹ÜÀí·½ÃæµÄÎÊÌâ¡£

¡¡¡¡ÄÚ´æÐ¹Â©ÊÇÓ¦ÓóÌÐòÖг£¼ûµÄÎÊÌ⣬²»¹ýÄú¿ÉÒÔʹÓñ¾ÎÄËù½²ÊöµÄ¹¤¾ßÀ´½â¾öÕâЩÎÊÌâ¡£

¡¡¡¡µÚ 4 ÖÖÇé¿ö£ºÊ¹ÓÃħÊõ¼ü¿ØË³Ðò½øÐлØËݸú×Ù

¡¡¡¡Èç¹ûÔÚ Linux ¹ÒÆðʱÄúµÄ¼üÅÌÈÔÈ»ÄÜÓã¬ÄÇÇëÄúʹÓÃÒÔÏ·½·¨À´°ïÖú½â¾ö¹ÒÆðÎÊÌâµÄ¸ùÔ´¡£×ñÑ­ÕâЩ²½Ö裬Äú±ã¿ÉÒÔÏÔʾµ±Ç°ÔËÐеĽø³ÌºÍËùÓÐʹÓÃħÊõ¼ü¿ØË³ÐòµÄ½ø³ÌµÄ»ØËݸú×Ù¡£

¡¡¡¡ÄúÕýÔÚÔËÐеÄÄں˱ØÐëÊÇÔÚÆôÓà CONFIG_MAGIC_SYS-REQ µÄÇé¿öϹ¹½¨µÄ¡£Äú»¹±ØÐë´¦ÔÚÎı¾Ä£Ê½¡£CLTR+ALT+F1 »áʹÄú½øÈëÎı¾Ä£Ê½£¬CLTR+ALT+F7 »áʹÄú»Øµ½ X Windows¡£

¡¡¡¡µ±ÔÚÎı¾Ä£Ê½Ê±£¬Çë°´ £¬È»ºó°´ ¡£ÉÏÊöħÊõµÄ»÷¼ü»á·Ö±ð¸ø³öµ±Ç°ÔËÐеĽø³ÌºÍËùÓнø³ÌµÄ¶ÑÕ»¸ú×Ù¡£
Çë²éÕÒ /var/log/messages¡£Èç¹ûÒ»ÇÐÉèÖÃÕýÈ·£¬ÔòϵͳӦ¸ÃÒѾ­ÎªÄúת»»ÁËÄں˵ķûºÅµØÖ·¡£»ØËݸú×Ù½«±»Ð´µ½ /var/log/messages ÎļþÖС£

¡¡¡¡½áÊøÓï

¡¡¡¡°ïÖúµ÷ÊÔ Linux ÉϵijÌÐòÓÐÐí¶à²»Í¬µÄ¹¤¾ß¿É¹©Ê¹Óᣱ¾ÎĽ²ÊöµÄ¹¤¾ß¿ÉÒÔ°ïÖúÄú½â¾öÐí¶à±àÂëÎÊÌâ¡£ÄÜÏÔʾÄÚ´æÐ¹Â©¡¢Òç³öµÈµÈµÄλÖõŤ¾ß¿ÉÒÔ½â¾öÄÚ´æ¹ÜÀíÎÊÌ⣬ÎÒ·¢ÏÖ MEMWATCH ºÍ YAMD ºÜÓаïÖú¡£

¡¡¡¡Ê¹Óà Linux Äں˲¹¶¡»áʹ gdb ÄÜÔÚ Linux ÄÚºËÉϹ¤×÷£¬Õâ¶Ô½â¾öÎÒ¹¤×÷ÖÐʹÓÃµÄ Linux µÄÎļþϵͳ·½ÃæµÄÎÊÌâºÜÓаïÖú¡£´ËÍ⣬¸ú×ÙʵÓóÌÐòÄܰïÖúÈ·¶¨ÔÚϵͳµ÷ÓÃÆÚ¼äÎļþϵͳʵÓóÌÐòʲôµØ·½³öÁ˹ÊÕÏ¡£Ï´ε±ÄúÒª°Úƽ Linux ÖеĴíÎóʱ£¬ÇëÊÔÊÔÕâЩ¹¤¾ßÖеÄijһ¸ö¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ