c-Xlib中XPutImage内部的奇怪分割错误



我正在制作一个程序,从打开的窗口中显示带有图标的任务栏。我做了一个函数,它使用两个指针和一些额外的辅助数据。两个指针icon_Data和icon_Data_Ptr分别指向原子_NET_WM_icon返回的数据和我将要使用的特定图标。以下是功能:

static Pixmap create_Pixmap_From_Icon_Data(Taskbar * taskbar, Taskbar_Item * taskbar_Item, uint32_t * icon_Data_Ptr, uint32_t * icon_Data) {
Pixmap icon_Pixmap = XCreatePixmap(taskbar->display, taskbar->parent, (unsigned int) icon_Data_Ptr[0], (unsigned int) icon_Data_Ptr[1], 32);
XImage * x_Image = XCreateImage(taskbar->display, taskbar->visual, 32, ZPixmap, 2, (char *) &icon_Data_Ptr, (unsigned int) icon_Data_Ptr[0], (unsigned int) icon_Data_Ptr[1], 32, 0);
GC temp_GC = XCreateGC(taskbar->display, icon_Pixmap, 0, 0);
XPutImage(taskbar->display, icon_Pixmap, temp_GC, x_Image, 0, 0, 0, 0, icon_Data_Ptr[0], icon_Data_Ptr[1]);
x_Image->data = (char *) icon_Data;
XDestroyImage(x_Image);
XFreeGC(taskbar->display, temp_GC);
return icon_Pixmap;
}

每当我试着运行这个程序时,大约有一半的时间会出错。来自Gdb的堆栈轨迹如下:

#0__memmove_sse2_unaligned_erms((在/sysdeps/x86_64/multiarch/memmove vec未对齐的erms。S: 262#memcpy中的1 0x00007ffff7c9f6b0(__len=<优化输出>,__src=0x7fffffdd48,__dest=<优化输出>(位于/usr/include/x86_64-linux-gnu/bits/string_defensed.h:34#2 SendZImage(destrongcanline_pad=<优化输出>,dest_bits_per_pixel=32、req_yoffset=0,req_xoffset=<优化出>,image=0x459dd0,req=<优化出>,dpy=0x4062a0(在..//src/PutImage.c:795#3 PutImageRequest(gc=<优化输出>,destrongcanline_pad=<优化出>,bits_ per_pixel=32,req_height=<优化出>,req_ width=<优化出>,y=<优化出>,x=<优化出>,req_ yoffset=0,req_xoffset=<优化出>,image=0x459dd0,d=<优化出>,dpy=0x4062a0(在..//src/PutImage.c:861#4 PutSubImage(dpy=0x4062a0,d=<优化输出>,gc=<优化出>,image=0x459dd0,req_xoffset=<优化出>,req_yoffset=<优化出>,x=0,y=0,req_width=48,req_height=48,dest_bits_per_pixel=32,destrongcanline_pad=32(在..//src/PutImage.c:899#XPutImage中的5 0x00007ffff7c9faae(dpy=0x4062a0,d=23068677,gc=0x459e60,image=0x459dd0,req_xoffset=0,req_yoffset=0,x=0,y=0,req_width=48,req_height=48(在..//src/PutImage.c:1018#create_Pixmap_From_Icon_Data中的6 0x00000000004022bc(任务栏=0x4088e0,任务栏项=0x413760,icon_Data_Ptr=0x4579b8,icon_Data=0x413890(。c:206#find_And_Set_Pixmap_From_Property_Data中的7 0x0000000000402032(任务栏=0x4088e0,任务栏项=0x413760,icon_Data=0x413890,item_Count=72012(。c:231#set_Taskbar_Item_Icon_Pixmap中的8 0x0000000000401c48(任务栏=0x4088e0,任务栏项=0x413760,实例=0x408860(在任务栏上。c:256#add_Instance_To_New_Taskbar_Item中的9 0x000000000040196c(任务栏=0x4088e0,实例=0x408860(。c:315#10 0x000000000040170e在add_Window_If_Enecessary中(--键入<RET>更多信息,q退出,c不分页继续--任务栏=0x4088e0,窗口=18876630(。c:386#iterate_Through_All_Windows中的11 0x0000000000402ae5(任务栏=0x4088e0,显示=0x4062a0,屏幕=0,迭代器_回调=0x401690<add_Window_If_Enecessary>(在任务栏测试c:31#setup_任务栏中的12 0x0000000000402997(任务栏=0x7fffffffdfb8,显示=0x4062a0,屏幕=0,父项=23068674,visual=0x408430,colormap=23068673(在任务栏测试c:42#taskbar_Test.c的main((中的13 0x00000000004027bf:72

在调试它的其他时间里,我检查了icon_Data_Ptr是否有足够的数据让XCreatePixmap运行,它确实有。然而,奇怪的是,我发现当Gdb进入XCreatePixmap时,指向函数内数据的指针与函数外的地址不同。此外,在使用GDB的过程中,我发现当我在XCreateImage内部时,图像的数据指针中没有足够的数据使函数工作。我还在XCreateImage的函数调用和XCreateImage函数调用内部转储了指向图像数据的内存。我使用Gimp导入了这些数据。该图像在函数外部看起来像chrome浏览器图标,但在函数内部,它看起来像是有序和随机颜色的混合,与chrome图标不同。

除了使用Gdb之外,我还试着用Clang代替GCC,看看这是否是一个编译器错误;它产生了同样的错误。

我不知道我做错了什么导致了这个分割错误,任何帮助都会得到回应。

我使用GDB逐步完成了机器代码,并在函数调用XCreateImage:lea -0x38(%rbp),%rdi之前看到了这一点。这将位于红色区域的局部变量的地址加载到rdi寄存器中,该寄存器随后被移动到r9寄存器中,作为Amd64的System V ABI的第六个参数(https://uclibc.org/docs/psABI-x86_64.pdf)。这意味着我没有传递icon_Data_Ptr的指针值,而是传递指针存储的地址:(char *) &icon_Data_Ptr。这导致坏的XImage结构被传递到XPutImage,从而导致分割错误。

相关内容

  • 没有找到相关文章

最新更新