使用某些静态库时在开罗出现段错误
Seg fault in cairo when using some static libraries
我截图的流程如下:
void take_screenshot(const std::string & file_name)
{
Display *disp;
Window root;
cairo_surface_t *surface;
int scr;
disp = XOpenDisplay(nullptr);
scr = DefaultScreen(disp);
root = DefaultRootWindow(disp);
surface = cairo_xlib_surface_create(disp, root, DefaultVisual(disp, scr),
DisplayWidth(disp, scr),
DisplayHeight(disp, scr));
cairo_surface_write_to_png(surface, file_name.c_str()); // <-- here is the seg fault
cairo_surface_destroy(surface);
}
这个例程摘自 https://whosebug.com/users/436275/uli-schlachter to this question Making a screenshot using Xlib and Cairo libs [fail] 的回答(感谢作者)
例程是名为 collector
的程序的一部分。 link编辑如下:
clang -o collector -g -O2 -fno-strict-aliasing collector.o common-vars.o \
collector-events.o listeners.o active_window.o \
../lib/libperfq-common.a -lPocoNet -lPocoFoundation -luiohook\
-lstdc++ -lgsl -lgslcblas -lm -lcairo -lXt -lXtst -lXinerama \
-lX11 -lpthread -lc
到目前为止一切顺利。该程序运行良好。
但是,当我静态 link poco 和 uiohook 库时,程序在上面指示的行处抛出段错误。
poco 和 uiohook 库静态 linked 生成的可执行文件如下:
clang -o collector -g -O2 -fno-strict-aliasing collector.o \
common-vars.o collector-events.o listeners.o active_window.o \
../lib/libperfq-common.a /home/lrleon/poco/lib/libPocoNet.a \
/home/lrleon/poco/lib/libPocoFoundation.a \
/home/lrleon/uiohook/lib/libuiohook.a -lstdc++ -lgsl -lgslcblas \
-lm -lcairo -lXt -lXtst -lXinerama -lX11 -lpthread -lc
对于这个版本,我有段错误。并且切换了一些动态库后,用调试器观察,我知道是什么导致了错误。
我猜想一些静态链接的库使对 cairo_surface_write_to_png()
的调用失败了。但是我不知道为什么。
有什么想法吗?提前致谢
由于 2.1 分支中的 xcb,我刚刚修补了 linux 上的崩溃。这可能会在 2.1.1 时解决您的问题。我建议尝试使用不包含 xcb 的 2.0,看看是否可以解决您的问题。
我截图的流程如下:
void take_screenshot(const std::string & file_name)
{
Display *disp;
Window root;
cairo_surface_t *surface;
int scr;
disp = XOpenDisplay(nullptr);
scr = DefaultScreen(disp);
root = DefaultRootWindow(disp);
surface = cairo_xlib_surface_create(disp, root, DefaultVisual(disp, scr),
DisplayWidth(disp, scr),
DisplayHeight(disp, scr));
cairo_surface_write_to_png(surface, file_name.c_str()); // <-- here is the seg fault
cairo_surface_destroy(surface);
}
这个例程摘自 https://whosebug.com/users/436275/uli-schlachter to this question Making a screenshot using Xlib and Cairo libs [fail] 的回答(感谢作者)
例程是名为 collector
的程序的一部分。 link编辑如下:
clang -o collector -g -O2 -fno-strict-aliasing collector.o common-vars.o \
collector-events.o listeners.o active_window.o \
../lib/libperfq-common.a -lPocoNet -lPocoFoundation -luiohook\
-lstdc++ -lgsl -lgslcblas -lm -lcairo -lXt -lXtst -lXinerama \
-lX11 -lpthread -lc
到目前为止一切顺利。该程序运行良好。
但是,当我静态 link poco 和 uiohook 库时,程序在上面指示的行处抛出段错误。
poco 和 uiohook 库静态 linked 生成的可执行文件如下:
clang -o collector -g -O2 -fno-strict-aliasing collector.o \
common-vars.o collector-events.o listeners.o active_window.o \
../lib/libperfq-common.a /home/lrleon/poco/lib/libPocoNet.a \
/home/lrleon/poco/lib/libPocoFoundation.a \
/home/lrleon/uiohook/lib/libuiohook.a -lstdc++ -lgsl -lgslcblas \
-lm -lcairo -lXt -lXtst -lXinerama -lX11 -lpthread -lc
对于这个版本,我有段错误。并且切换了一些动态库后,用调试器观察,我知道是什么导致了错误。
我猜想一些静态链接的库使对 cairo_surface_write_to_png()
的调用失败了。但是我不知道为什么。
有什么想法吗?提前致谢
由于 2.1 分支中的 xcb,我刚刚修补了 linux 上的崩溃。这可能会在 2.1.1 时解决您的问题。我建议尝试使用不包含 xcb 的 2.0,看看是否可以解决您的问题。