调试X Server

发现错误

运行X之后出现了错误:

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 X
root       570  0.0  0.1  54100 20976 pts/1    S+   19:16   0:00 gdb /usr/bin/X
root       670  0.1  0.2 144108 31652 tty8     ts+  19:17   0:00 /usr/bin/X
root     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/Xorg
7fbc35af7000-7fbc35afa000 r--p 001e6000 00:01 117964                     /usr/bin/Xorg
7fbc35afa000-7fbc35b05000 rw-p 001e9000 00:01 117964                     /usr/bin/Xorg
7fbc35b05000-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程序里边

编译与调试Xorg

下载源码:

  1. apt-get source xserver-xorg-core

下载依赖:

  1. apt-get build-dep xserver-xorg-core

生成Makefile:

  1. ./autogen.sh

修改Makefile,使之可以GDB调试:
vim Makefile,把CFLAGSCCASFLAGS选项修改为

CCASFLAGS = -g -O0
CFLAGS = -g -O0

编译并进行安装

  1. make -j4 install

安装的位置是/usr/local/bin/Xorg,所以启动的时候需要把startx的路径指向于这里,同时还需要把一些库链接过来:

mv /usr/local/lib/xorg  /usr/local/lib/xorg.org
ln -svf  /usr/lib/xorg  /usr/local/lib/xorg
ln -svf /usr/bin/xkb* /usr/local/bin/

注意,如果修改了Xorg的代码,再编译安装的话,安装之前需要把 /usr/local/lib/Xorg 这个链接删掉,避免覆盖了原有的文件

或者手工拷贝替换的文件,比如make -j4 && cp hw/xfree86/Xorg /usr/local/bin/Xorg,这样子就可以继续测试了;

调试:

cgdb /usr/local/bin/Xorg
run
bt

发现问题出现在了 strtol里边,接着调试glibc;

先不调试glibc,因为它不太可能出现Bug,问题现在定位到是GLX初始化时出现的错误

  1. b RegisterExtensionNames if strcmp(extEntry->name, "GLX") == 0

修改全部的Makefile文件,让它们可以进行debug

  1. find . -name Makefile -print -exec sed -i 's/-g -O2/-g -O0/g' {} \;

最后找丁技术确认了这个安装这个GLX时,libglx.so可能会去修改寄存器fs(或者是说它的进入初始化的姿势不太一样?)的内容,这个libglx.so是由NVIDIA提供的,暂时无法修改.





posted @   scue  阅读(1696)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示