【发布时间】: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);
如果删除该行,应用程序将正常工作
谢谢
【问题讨论】:
-
顺便说一句,你知道
int和unsigned long不一样,对吧? -
另外,你为什么不检查
XOpenDisplay()的NULL返回? -
您的代码中缺少大量错误处理。
-
使用 XGetWindowAttributes 找到屏幕的实际宽度/高度。不要使用硬编码值。
-
除了检查
NULL的注释外,XGetPixel的手册页说 图像必须包含 x 和 y 坐标。您尚未检查。跨度>