如何在嵌入式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剩余多少空间,如果小于预留的空间,就不保存了,这样会避开空间问题。
相关文章推荐
- 如何在嵌入式Linux产品中做立体、覆盖产品生命期的调试 ( 2 )
- 如何在嵌入式Linux产品中做立体、覆盖产品生命期的调试 ( 1 )
- 如何在嵌入式Linux产品中做立体、覆盖产品生命期的调试 (5)
- 如何在嵌入式Linux产品中做立体、覆盖产品生命期的调试 ( 3 )
- 嵌入式系统产品是如何使用Linux
- linux下如何进行PHP调试
- 嵌入式linux产品USB设备动态监控技术研究
- gdbserver远程调试嵌入式Linux设备
- 如何在嵌入式LINUX中增加自己的设备驱动程序
- 如何移植开源软件到嵌入式Linux系统
- (14)caffe总结之Linux下Caffe如何调试
- 在嵌入式linux下用gdb server和gdb调试
- 2440,嵌入式linux平台12864驱动(调试完成)
- Linux环境下如何调试live555
- linux下如何产生core,调试core
- 嵌入式Linux之Kernel(裁减移植)启动调试、打印技术 printascii(补充)、内核调试
- linux-kernel调试技术大全<一>上海嵌入式索漫科技培训教材
- 嵌入式Linux开发学习如何入门、如何深入?
- linux下如何产生core,调试core
- 如何制作嵌入式Linux虚拟机