发现错误

运行X之后出现了错误:

  1. Program received signal SIGSEGV, Segmentation fault.
  2. 0x00007fbc3336fb63 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
  3. (gdb) bt
  4. #0 0x00007fbc3336fb63 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
  5. #1 0x00007fbc35785087 in RegisterExtensionNames ()
  6. #2 0x00007fbc35775599 in AddExtension ()
  7. #3 0x00007fbc31501b62 in ?? () from /usr/lib/xorg/modules/extensions/libglx.so
  8. #4 0x00007fbc35775720 in ?? ()
  9. #5 0x0000000000000168 in ?? ()
  10. #6 0x00007fbc35b07600 in ?? ()
  11. #7 0x0000000000000000 in ?? ()

查看RegisterExtensionNames出错的位置

  1. 先查看X进行PID信息
  1. ps aux|grep X
  2. root 570 0.0 0.1 54100 20976 pts/1 S+ 19:16 0:00 gdb /usr/bin/X
  3. root 670 0.1 0.2 144108 31652 tty8 ts+ 19:17 0:00 /usr/bin/X
  4. root 17519 0.0 0.0 22492 1084 pts/0 S+ 19:20 0:00 grep X
  1. 再查看670的maps
  1. cat /proc/670/maps
  2. ...
  3. 7fbc35711000-7fbc358f8000 r-xp 00000000 00:01 117964 /usr/bin/Xorg
  4. 7fbc35af7000-7fbc35afa000 r--p 001e6000 00:01 117964 /usr/bin/Xorg
  5. 7fbc35afa000-7fbc35b05000 rw-p 001e9000 00:01 117964 /usr/bin/Xorg
  6. 7fbc35b05000-7fbc35b15000 rw-p 00000000 00:00 0
  7. 7fbc35dea000-7fbc35e9f000 rw-p 00000000 00:00 0 [heap]
  8. 7fff642d4000-7fff64330000 rw-p 00000000 00:00 0 [stack]
  9. 7fff643fe000-7fff64400000 r-xp 00000000 00:00 0 [vdso]
  10. ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
  11. ...

其中 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,把CFLAGS和CCASFLAGS选项修改为

  1. CCASFLAGS = -g -O0
  2. CFLAGS = -g -O0

编译并进行安装

  1. make -j4 install

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

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

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

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

调试:

  1. cgdb /usr/local/bin/Xorg
  2. run
  3. 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提供的,暂时无法修改.

调试X Server的更多相关文章

  1. 使用WinDbg调试SQL Server查询

    上一篇文章我给你介绍了WinDbg的入门,还有你如何能附加到SQL Server.今天的文章,我们继续往前一步,我会向你展示使用WinDbg调试SQL Server查询需要的步骤.听起来很有意思?我们 ...

  2. 使用WinDbg调试SQL Server——入门

    这篇文章我想探究下SQL Server里完全不同的领域:如果使用WinDbg(来自针对Windows的调试工具)调试SQL Server.在我们进入枯涩细节之前,我想详细解释下为什么选择这样晦涩的话题 ...

  3. Eclipse调试cas server 3.5.2.1

    由于在配置CAS+LDAP总是报错,决定Eclipse调试cas server,跟踪问题出在哪里? ================================================== ...

  4. 如何设断点????-----使用WinDbg调试SQL Server查询

    http://www.cnblogs.com/woodytu/p/4665427.html http://www.sqlservercentral.com/blogs/aschenbrenner/20 ...

  5. VS调试SQL Server存储过程

    1.打开VS,视图-->SQL Server对象资源管理器.(我用的是VS2012) 2.添加链接,连接到数据库. 3.选择要调试的存储过程,右键,选择调试过程或者执行过程. 4.填写存储过程所 ...

  6. Visual Studio 2017 调试 windows server 2016 Docker Container

    网上很多文章都是在win10下,用Docker for windows工具进行Docker的安装部署的.用知道windows server 2016已经原生支持Docker了,其windows Con ...

  7. 调试SQL Server的存储过程及用户定义函数

    分类: 数据库管理 2005-06-03 13:57 9837人阅读 评论(5) 收藏 举报 sql server存储vb.net服务器sql语言 1.在查询分析器中调试 查询分析器中调试的步骤如下: ...

  8. IDEA远程调试Ambari Server

    1.配置端口 Ambari Server默认配置了服务端的debug参数,端口为5005.如果要修改端口,可以在/usr/sbin/ambari_server_main.py文件中对应地方修改,直接改 ...

  9. VS 调试Window Server方法

    在需要调试的地方加 Debugger.Launch();然后在本机安装服务并启动即可进入

随机推荐

  1. apktool更新,JDK升级配置

    最近使用apktool反编译apk中的xml文件总是失败. Exception in thread "main" brut.androlib.AndrolibException: ...

  2. 【Map】MapTest

    package cn.itcast.p1.map.test; import java.util.HashMap; import java.util.Map; public class MapTest2 ...

  3. hibernate报错及解决方式

    1 java.sql.BatchUpdateException: ORA-01438: 值大于为此列指定的允许精度 原因:pl/sql number(n),插入的位数大于n

  4. web form 复合控件

    DropDownList 下拉列表 会被编译为select option ps.name 服务端常用,id 客户端常用 一般用法: 一.将数据放进去 方法一:同WinForm相同,给定数据源,然后绑定 ...

  5. TreeView树形控件递归绑定数据库里的数据

    TreeView树形控件递归绑定数据库里的数据. 第一种:性能不好 第一步:数据库中查出来的表,字段名分别为UNAME(显示名称),DID(关联数据),UTYPE(类型) 第二步:前台代码 <% ...

  6. Spring的定时任务配置2(转)

    spring的定时任务配置分为三个步骤: 1.定义任务 2.任务执行策略配置 3.启动任务 1.定义任务 <!--要定时执行的方法--> <bean id="testTas ...

  7. Python-同时匹配邮箱和电话号码的正则表达式

    同时匹配邮箱和电话号码的正则表达式要想很完美的匹配,不太简单. 各邮箱提供商的标准都多少有些许差别.如:163:6-18个字符,可使用字母.数字.下划线,需以字母开头. gmail:可以使用字母.数字 ...

  8. Frugalware Linux 1.9 RC1 发布

    Frugalware Linux 1.9 RC1 发布了,下载地址:fvbe-1.9rc1-full-x86_64.iso (1,874MB, SHA1). 发行通知:http://www.fruga ...

  9. 《Linux内核设计与实现》读书笔记(十八)- 内核调试

    内核调试的难点在于它不能像用户态程序调试那样打断点,随时暂停查看各个变量的状态. 也不能像用户态程序那样崩溃后迅速的重启,恢复初始状态. 用户态程序和内核交互,用户态程序的各种状态,错误等可以由内核来 ...

  10. 手机H5 web调试利器——WEINRE (WEb INspector REmote)

    手机H5 web调试利器--WEINRE (WEb INspector REmote) 调试移动端页面,优先选择使用chrome浏览器调试,如果是hybrid形式的页面,可以使用chrome提供的ch ...