【问题标题】:I want to determine the cause of a sigsegv我想确定 sigsegv 的原因
【发布时间】:2016-04-12 04:31:53
【问题描述】:

我正在为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 机器安装任何其他软件包(或从 3rd 方 repos 安装)

回溯: (gdb) bt

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

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

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

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

谢谢

【问题讨论】:

  • 顺便说一句,你知道intunsigned long 不一样,对吧?
  • 另外,你为什么不检查XOpenDisplay()的NULL返回?
  • 您的代码中缺少大量错误处理。
  • 使用 XGetWindowAttributes 找到屏幕的实际宽度/高度。不要使用硬编码值。
  • 除了检查 NULL 的注释外,XGetPixel 的手册页说 图像必须包含 x 和 y 坐标。您尚未检查。跨度>

标签: c linux x11 xlib


【解决方案1】:

使用XGetWindowAttributes 查找屏幕的实际宽度/高度。不要使用硬编码的值。

【讨论】:

    【解决方案2】:

    很可能是这一行返回 NULL:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      相关资源
      最近更新 更多