zoukankan      html  css  js  c++  java
  • 调试X Server

    发现错误

    运行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,把CFLAGSCCASFLAGS选项修改为

    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提供的,暂时无法修改.





  • 相关阅读:
    php yield
    原来 php 中的 json_encode() 只支持utf-8.不支持gbk啊
    mongodb 二进制安装
    Centos 6.3 安装教程
    php 测试 程序执行时间,内存使用情况
    workerman vmstat服务器状态监控服务
    php大量数据 10M数据从查询到下载 【内存溢出,查询过慢】解决方案
    PHP_EOL DIRECTORY_SEPARATOR
    利用curl 模拟多线程
    Laravel 输出最后一条sql
  • 原文地址:https://www.cnblogs.com/scue/p/5759947.html
Copyright © 2011-2022 走看看