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

2019-07-13 06:27发布

  上接:如何在嵌入式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剩余多少空间,如果小于预留的空间,就不保存了,这样会避开空间问题。