運行X以後出現了錯誤:linux
Program received signal SIGSEGV, Segmentation fault.0x00007fbc3336fb63 in ?? () from /lib/x86_64-linux-gnu/libc.so.6(gdb) bt#0 0x00007fbc3336fb63 in ?? () from /lib/x86_64-linux-gnu/libc.so.6#1 0x00007fbc35785087 in RegisterExtensionNames ()#2 0x00007fbc35775599 in AddExtension ()#3 0x00007fbc31501b62 in ?? () from /usr/lib/xorg/modules/extensions/libglx.so#4 0x00007fbc35775720 in ?? ()#5 0x0000000000000168 in ?? ()#6 0x00007fbc35b07600 in ?? ()#7 0x0000000000000000 in ?? ()
RegisterExtensionNames
出錯的位置ps aux|grep Xroot 570 0.0 0.1 54100 20976 pts/1 S+ 19:16 0:00 gdb /usr/bin/Xroot 670 0.1 0.2 144108 31652 tty8 ts+ 19:17 0:00 /usr/bin/Xroot 17519 0.0 0.0 22492 1084 pts/0 S+ 19:20 0:00 grep X
cat /proc/670/maps...7fbc35711000-7fbc358f8000 r-xp 00000000 00:01 117964 /usr/bin/Xorg7fbc35af7000-7fbc35afa000 r--p 001e6000 00:01 117964 /usr/bin/Xorg7fbc35afa000-7fbc35b05000 rw-p 001e9000 00:01 117964 /usr/bin/Xorg7fbc35b05000-7fbc35b15000 rw-p 00000000 00:00 0 7fbc35dea000-7fbc35e9f000 rw-p 00000000 00:00 0 [heap]7fff642d4000-7fff64330000 rw-p 00000000 00:00 0 [stack]7fff643fe000-7fff64400000 r-xp 00000000 00:00 0 [vdso]ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]...
其中 0x00007fbc35785087
就包含在了7fbc35711000-7fbc358f8000 r-xp 00000000 00:01 117964 /usr/bin/Xorg
裏邊,說明出錯位置在Xorg程序裏邊vim
下載源碼:測試
apt-get source xserver-xorg-core
下載依賴:ui
apt-get build-dep xserver-xorg-core
生成Makefile:spa
./autogen.sh
修改Makefile,使之能夠GDB調試:
vim Makefile,把CFLAGS
和CCASFLAGS
選項修改成debug
CCASFLAGS = -g -O0CFLAGS = -g -O0
編譯並進行安裝調試
make -j4 install
安裝的位置是/usr/local/bin/Xorg
,因此啓動的時候須要把startx的路徑指向於這裏,同時還須要把一些庫連接過來:code
mv /usr/local/lib/xorg /usr/local/lib/xorg.orgln -svf /usr/lib/xorg /usr/local/lib/xorgln -svf /usr/bin/xkb* /usr/local/bin/
注意,若是修改了Xorg的代碼,再編譯安裝的話,安裝以前須要把 /usr/local/lib/Xorg 這個連接刪掉,避免覆蓋了原有的文件server
或者手工拷貝替換的文件,好比make -j4 && cp hw/xfree86/Xorg /usr/local/bin/Xorg
,這樣子就能夠繼續測試了;blog
調試:
cgdb /usr/local/bin/Xorgrunbt
先不調試glibc,由於它不太可能出現Bug,問題如今定位到是GLX初始化時出現的錯誤
b RegisterExtensionNames if strcmp(extEntry->name, "GLX") == 0
修改所有的Makefile文件,讓它們能夠進行debug
find . -name Makefile -print -exec sed -i 's/-g -O2/-g -O0/g' {} \;
最後找丁技術確認了這個安裝這個GLX時,libglx.so可能會去修改寄存器fs(或者是說它的進入初始化的姿式不太同樣?)的內容,這個libglx.so是由NVIDIA提供的,暫時沒法修改.