您的位置:首页 > 运维架构 > Linux

如何在嵌入式Linux产品中做立体、覆盖产品生命期的调试 ( 4 )

2007-12-26 13:19 295 查看
 
上接:如何在嵌入式Linux产品中做立体、覆盖产品生命期的调试 ( 3)
 
这篇谈谈抓屏(screenshot)的做法:
所谓抓屏:就是把出现问题时界面的情况抓下来,可以抓模拟器,LCD或者terminal的屏幕;抓屏比较适合于产品使用期,这时候开发人员看不当时的情况,如果出现问题,把屏幕抓下来,对于事后分析问题很有帮助
       下面的抓屏函数,你可以它拷贝到你的模块中编译,然后调用即可;如果想在一个项目中统一使用,就把它编译成一个可执行文件,放到你们程序能找到的地方,比如/usr/bin等处,项目中的各个模块都可以使用了;
 
1 抓屏函数
[align=left] [/align]
[align=left]#include <gtk/gtkmain.h>[/align]
[align=left] [/align]
[align=left]//抓屏函数[/align]
[align=left]static gboolean[/align]
[align=left]screenshot (const char *filename, GError **error)[/align]
[align=left]{[/align]
[align=left] GdkDrawable *root_window;[/align]
[align=left] int          width, height;[/align]
[align=left] GdkPixbuf   *pixbuf;[/align]
[align=left] gboolean     ret;[/align]
[align=left] [/align]
[align=left] root_window = gdk_get_default_root_window ();[/align]
[align=left] gdk_drawable_get_size (root_window, &width, &height);[/align]
[align=left] [/align]
[align=left] pixbuf = gdk_pixbuf_get_from_drawable (NULL,[/align]
[align=left]                                                                             root_window,[/align]
[align=left]                                                                             gdk_drawable_get_colormap (root_window),[/align]
[align=left]                                                                             0, 0,[/align]
[align=left]                                                                             0, 0,[/align]
[align=left]                                                                             width, height);[/align]
[align=left] [/align]
[align=left] ret = gdk_pixbuf_save (pixbuf, filename, "png", error, NULL);[/align]
[align=left] g_object_unref (pixbuf);[/align]
[align=left] [/align]
[align=left] return ret;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]//把抓屏函数编译成抓屏工具:可执行文件,[/align]
[align=left]int[/align]
[align=left]main (int argc, char **argv)[/align]
[align=left]{[/align]
[align=left] const char *filename;[/align]
[align=left] GError     *error = NULL;[/align]
[align=left] [/align]
[align=left] gtk_init (&argc, &argv);[/align]
[align=left] [/align]
[align=left] if (argc != 2)[/align]
[align=left]    {[/align]
[align=left]      g_printerr ("Usage: %s filename.png/n", g_get_prgname ());[/align]
[align=left]      return 1;[/align]
[align=left]    }[/align]
[align=left] filename = argv[1];[/align]
[align=left] [/align]
[align=left] if (screenshot (filename, &error))[/align]
[align=left]    return 0;[/align]
[align=left] [/align]
[align=left] g_printerr ("%s: %s/n", g_get_prgname (), error->message);[/align]
[align=left] g_error_free (error);[/align]
[align=left] return 1;[/align]
[align=left]}[/align]
 
2 makefile

[align=left]//根据项目的不同配置,你可以修改这个prefix;[/align]
[align=left][/align]
[align=left]prefix = /usr[/align]
[align=left]bindir = $(prefix)/bin[/align]
[align=left] [/align]
[align=left]CC ?= gcc[/align]
[align=left]CFLAGS ?= -Wall -O2 -g[/align]
[align=left]CFLAGS += $(GTK_CFLAGS)[/align]
[align=left]LDLIBS += $(GTK_LIBS)[/align]
[align=left] [/align]
[align=left]GTK_CFLAGS := $(shell pkg-config --cflags gtk+-2.0)[/align]
[align=left]GTK_LIBS := $(shell pkg-config --libs gtk+-2.0)[/align]
[align=left] [/align]
[align=left]all: screenshot-tool[/align]
[align=left] [/align]
[align=left]clean:[/align]
[align=left]               rm -f screenshot-tool[/align]
[align=left] [/align]
[align=left]install: screenshot-tool[/align]
[align=left]               install -m755 -d $(DESTDIR)$(bindir)[/align]
[align=left]               install -m755 screenshot-tool $(DESTDIR)$(bindir)/[/align]
[align=left] [/align]
[align=left]distclean: clean[/align]
[align=left] [/align]
[align=left].PHONY: all clean distclean install[/align]
 
3 如何使用:
 
3-1: 如果把抓屏函数放到你的文件中一块编译,可以直接调用函数
[align=left] [/align]
[align=left]void test_func1 (void)[/align]
[align=left]{[/align]
[align=left]    //...[/align]
[align=left]    GError *error = NULL;[/align]
[align=left]    screenshot (“test.png”, &error);[/align]
[align=left]    //…[/align]
[align=left]}[/align]
 
3-2: 如果把抓屏函数编译成可执行文件,放到了/usr/bin/目录下,项目中的模块可以这样用:
[align=left] [/align]
[align=left]void test_func2 (void)[/align]
[align=left]{[/align]
[align=left]    //...[/align]
[align=left]    char cmd[128] = {0};[/align]
[align=left]    sprintf(cmd, "%s  %s", “usr/bin/screenshot-tool”, “test.png”);[/align]
[align=left]    system(cmd);[/align]
[align=left]    //…[/align]
[align=left]}[/align]
 
第二种方法比较通用点。
 
当然,你也不能老用这个工具,结果抓了很多图片,很好,当心空间的问题啊,呵呵,别把空间给用光了;
 
如果考虑空间的话,可以给这个工具升级一下,判断当前flash剩余多少空间,如果小于预留的空间,就不保存了,这样会避开空间问题。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息