我想确定一个sigsegv的原因

时间:2016-01-07 17:01:23

标签: c linux x11 xlib

我正在为gentoo linux和redhat linux编写应用程序,其中一个函数总是在redhat机器上崩溃

usleep(100000);
    Display *display;
    display = XOpenDisplay(NULL);
    Window w;
    int x,y,i;
    unsigned m;
    Window root = XDefaultRootWindow(display);
    XQueryPointer(display,root,&root,&w,&x,&y,&i,&i,&m);
    XImage *image;
    sleep(1);
    image = XGetImage(display,root,0,0,1366,768,AllPlanes,XYPixmap);
    int pixel = XGetPixel(image,x,y);
    printf("\\clr(%i,%i,%i){}\n",x,y,pixel);
    XCloseDisplay(display);

此功能始终因rhel机器上的分段故障而崩溃

在gdb中运行progrma: 程序接收信号SIGSEGV,分段故障。 0x000000369942cb48在? ()来自/usr/lib64/libX11.so.6 如果缺少单独的debuginfos,请使用:debuginfo-install atk-1.30.0-1.el6.x86_64 cairo-1.8.8-6.el6_6.x86_64 expat-2.0.1-11.el6_2.x86_64 fontconfig-2.8.0-5。 el6.x86_64 freetype-2.3.11-15.el6_6.1.x86_64 gdk-pixbuf2-2.24.1-6.el6_7.x86_64 glib2-2.28.8-4.el6.x86_64 glibc-2.12-1.166.el6_7.1。 x86_64 gtk2-2.24.23-6.el6.x86_64 libX11-1.6.0-6.el6.x86_64 libXau-1.0.6-4.el6.x86_64 libXcomposite-0.4.3-4.el6.x86_64 libXcursor-1.1.14 -2.1.el6.x86_64 libXdamage-1.1.3-4.el6.x86_64 libXext-1.3.2-2.1.el6.x86_64 libXfixes-5.0.1-2.1.el6.x86_64 libXi-1.7.2-2.2.el6.x86_64 libXinerama-1.1.3-2.1.el6.x86_64 libXrandr-1.4.1-2.1.el6.x86_64 libXrender-0.9.8-2.1.el6.x86_64 libXtst-1.2.2-2.1.el6.x86_64 libpng-1.2.49- 2.el6_7.x86_64 libselinux-2.0.94-5.8.el6.x86_64 libxcb-1.9.1-3.el6.x86_64 pango-1.28.1-10.el6.x86_64 pixman-0.32.4-4.el6.x86_64 zlib -1.2.3-29.el6.x86_64

遗憾的是,我无法为rhel机器安装任何其他软件包(或从第三方软件仓库安装)

回溯: (gdb)bt

0 0x000000369942cb48 in ?? ()来自/usr/lib64/libX11.so.6

主要的

1 0x00000000004048ce(argc = 2,argv = 0x7fffffffe148)at tat.c:92

第92行是:     int pixel = XGetPixel(image,x,y);

如果删除该行,该应用程序可以正常工作

感谢

2 个答案:

答案 0 :(得分:1)

很可能是这行返回NULL:

image = XGetImage(display,root,0,0,1366,768,AllPlanes,XYPixmap);

Manual Page说:如果出现问题,XGetImage将返回NULL。

但是,此错误可能由前一行的错误触发 - 如评论中所述,您应该检查所有这些调用的返回值是否成功。

答案 1 :(得分:1)

使用for f in files_xls: data = pd.read_excel(f,header=None,skiprows=0) master = master.append(data, ignore_index=True) master.columns = ['col1','col2',col3'] 查找屏幕的实际宽度/高度。不要使用硬编码值。