調試X Server

發現錯誤

運行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出錯的位置

  1. 先查看X進行PID信息
 
 
 
 
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
  1. 再查看670的maps
 
 
 
 
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

編譯與調試Xorg

下載源碼:測試

 
 
 
 
apt-get source xserver-xorg-core

下載依賴:ui

 
 
 
 
apt-get build-dep xserver-xorg-core

生成Makefile:spa

 
 
 
 
./autogen.sh

修改Makefile,使之能夠GDB調試:
vim Makefile,把CFLAGSCCASFLAGS選項修改成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

發現問題出如今了 strtol裏邊,接着調試glibc;

先不調試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提供的,暫時沒法修改.



相關文章
相關標籤/搜索