上接:如何在嵌入式Linux产品中做立体、覆盖产品生命期的调试 ( 3)
这篇谈谈抓屏(screenshot)的做法:
所谓抓屏:就是把出现问题时界面的情况抓下来,可以抓模拟器,LCD或者terminal的屏幕;抓屏比较适合于产品使用期,这时候开发人员看不当时的情况,如果出现问题,把屏幕抓下来,对于事后分析问题很有帮助
下面的抓屏函数,你可以它拷贝到你的模块中编译,然后调用即可;如果想在一个项目中统一使用,就把它编译成一个可执行文件,放到你们程序能找到的地方,比如/usr/bin等处,项目中的各个模块都可以使用了;
1 抓屏函数
#include
//抓屏函数
static gboolean
screenshot (const char *filename, GError **error)
{
GdkDrawable *root_window;
int width, height;
GdkPixbuf *pixbuf;
gboolean ret;
root_window = gdk_get_default_root_window ();
gdk_drawable_get_size (root_window, &width, &height);
pixbuf = gdk_pixbuf_get_from_drawable (NULL,
root_window,
gdk_drawable_get_colormap (root_window),
0, 0,
0, 0,
width, height);
ret = gdk_pixbuf_save (pixbuf, filename, "png", error, NULL);
g_object_unref (pixbuf);
return ret;
}
//把抓屏函数编译成抓屏工具:可执行文件,
int
main (int argc, char **argv)
{
const char *filename;
GError *error = NULL;
gtk_init (&argc, &argv);
if (argc != 2)
{
g_printerr ("Usage: %s filename.png/n", g_get_prgname ());
return 1;
}
filename = argv[1];
if (screenshot (filename, &error))
return 0;
g_printerr ("%s: %s/n", g_get_prgname (), error->message);
g_error_free (error);
return 1;
}
2 makefile
//根据项目的不同配置,你可以修改这个prefix;
prefix = /usr
bindir = $(prefix)/bin
CC ?= gcc
CFLAGS ?= -Wall -O2 -g
CFLAGS += $(GTK_CFLAGS)
LDLIBS += $(GTK_LIBS)
GTK_CFLAGS := $(shell pkg-config --cflags gtk+-2.0)
GTK_LIBS := $(shell pkg-config --libs gtk+-2.0)
all: screenshot-tool
clean:
rm -f screenshot-tool
install: screenshot-tool
install -m755 -d $(DESTDIR)$(bindir)
install -m755 screenshot-tool $(DESTDIR)$(bindir)/
distclean: clean
.PHONY: all clean distclean install
3 如何使用:
3-1: 如果把抓屏函数放到你的文件中一块编译,可以直接调用函数
void test_func1 (void)
{
//...
GError *error = NULL;
screenshot (“test.png”, &error);
//…
}
3-2: 如果把抓屏函数编译成可执行文件,放到了/usr/bin/目录下,项目中的模块可以这样用:
void test_func2 (void)
{
//...
char cmd[128] = {0};
sprintf(cmd, "%s %s", “usr/bin/screenshot-tool”, “test.png”);
system(cmd);
//…
}
第二种方法比较通用点。
当然,你也不能老用这个工具,结果抓了很多图片,很好,当心空间的问题啊,呵呵,别把空间给用光了;
如果考虑空间的话,可以给这个工具升级一下,判断当前flash剩余多少空间,如果小于预留的空间,就不保存了,这样会避开空间问题。