日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux系統(tǒng)中找出并解決程序錯誤方法( 三 )



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);
}

清單 4. 內(nèi)存代碼(test2.c)
您可以使用下面的命令來啟動 YAMD:

CODE:./run-yamd /usr/src/test/test2/test2
清單 5 顯示了在樣本程序 test2 上使用 YAMD 得到的輸出 。YAMD 告訴我們在 for 循環(huán)中有“越界(out-of-bounds)”的情況 。

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.

清單 5. 使用 YAMD 的 test2 輸出
MEMWATCH 和 YAMD 都是很有用的調(diào)試工具 , 它們的使用方法有所不同 。對于 MEMWATCH , 您需要添加包含文件 memwatch.h 并打開兩個編譯時間標(biāo)記 。對于鏈接(link)語句 , YAMD 只需要 -g 選項 。
Electric Fence
多數(shù) Linux 分發(fā)版包含一個 Electric Fence 包 , 不過您也可以選擇下載它 。Electric Fence 是一個由 Bruce Perens 編寫的 malloc() 調(diào)試庫 。它就在您分配內(nèi)存后分配受保護(hù)的內(nèi)存 。如果存在 fencepost 錯誤(超過數(shù)組末尾運行) , 程序就會產(chǎn)生保護(hù)錯誤 , 并立即結(jié)束 。通過結(jié)合 Electric Fence 和 gdb , 您可以精確地跟蹤到哪一行試圖訪問受保護(hù)內(nèi)存 。Electric Fence 的另一個功能就是能夠檢測內(nèi)存泄漏 。
第 2 種情況:使用 strace
strace 命令是一種強大的工具 , 它能夠顯示所有由用戶空間程序發(fā)出的系統(tǒng)調(diào)用 。strace 顯示這些調(diào)用的參數(shù)并返回符號形式的值 。strace 從內(nèi)核接收信息 , 而且不需要以任何特殊的方式來構(gòu)建內(nèi)核 。將跟蹤信息發(fā)送到應(yīng)用程序及內(nèi)核開發(fā)者都很有用 。在清單 6 中 , 分區(qū)的一種格式有錯誤 , 清單顯示了 strace 的開頭部分 , 內(nèi)容是關(guān)于調(diào)出創(chuàng)建文件系統(tǒng)操作(mkfs)的 。strace 確定哪個調(diào)用導(dǎo)致問題出現(xiàn) 。

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)
= ?

清單 6. mkfs 上 strace 的開頭部分
清單 6 顯示 ioctl 調(diào)用導(dǎo)致用來格式化分區(qū)的 mkfs 程序失敗 。ioctl BLKGETSIZE64 失敗 。(BLKGET-SIZE64 在調(diào)用 ioctl 的源代碼中定義 。) BLKGETSIZE64 ioctl 將被添加到 Linux 中所有的設(shè)備 , 而在這里 , 邏輯卷管理器還不支持它 。因此 , 如果 BLKGETSIZE64 ioctl 調(diào)用失敗 , mkfs 代碼將改為調(diào)用較早的 ioctl 調(diào)用;這使得 mkfs 適用于邏輯卷管理器 。
第 3 種情況:使用 gdb 和 Oops

推薦閱讀