所謂的段錯誤就是指訪問的内存超出了系統所給這個程序的内存空間。
通常這個值是由gd tr來保存的,他是一個48位的寄存器,其中的32位是保存由它指向的 gdt表,後13位保存 相應于gdt的下标,最後3位包括了程序是否在内存中以及程序的在cpu中的運行級别,指向 的gdt是由以64位為一個單位的表,在這張表中就保存着程序運行的代碼段以及數據段的起 始地址以及與此相應的段限和頁面交換還有程序運行級别還有内存粒度等等的信息。
幾種典型的段錯誤1,
int main(void){[1]
char*s ="hello world";
利用gdb逐步查找段錯誤
這種方法也是被大衆所熟知并廣泛采用的方法,首先我們需要一個帶有調試信息的可執行程序,所以我們加上“-g -rdynamic"的參數進行編譯,然後用gdb調試運行這個新編譯的程序,具體步驟如下:
xiaosuo@gentux test $ gcc -g -rdynamic d.c
xiaosuo@gentux test $ gdb ./a.out
GNU gdb 6.5
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread
(gdb) r
Starting program: /home/xiaosuo/test/a.out
Program received signal SIGSEGV, Segmentation fault.
0x08048524 in dummy_function () at d.c:4
4 *ptr = 0x00;
(gdb)
不用一步步調試我們就找到了出錯位置d.c文件的第4行,其實就是如此的簡單。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!