我想确定 sigsegv 的原因

I want to determine the cause of a sigsegv

我正在为 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中的程序: 程序收到信号 SIGSEGV,分段错误。 0x000000369942cb48 在 ?? () 来自 /usr/lib64/libX11.so.6 缺少单独的调试信息,使用: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 机器安装任何额外的软件包(或从第 3 方存储库安装)

回溯: (gdb) bt

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

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

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

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

谢谢

很可能是这一行 returning NULL:

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

Manual Page 说:如果出现问题,XGetImage returns NULL。

但是,此错误可能是由上一行的错误触发的——如评论中所述,您应该检查所有这些调用的 return 值 success/failure。

使用XGetWindowAttributes找到屏幕的真实width/heitgh。不要使用硬编码值。