全部博文(185)
分类:
2009-02-27 10:13:53
hello_gdb.c |
/* 本例的主要目的是在窗口中显示一个按钮, * 单击按钮退出程序,并构建几个变量来演示GDB功能。 */ #include void cb_button(GtkWidget *widget, gpointer data) {// 按钮"button"的回调函数 gint i=5; gint j=++i; gtk_main_quit(); } //此函数用于演示GDB直接调用被调试程序的函数 gint gdb_test(gint arg) { g_print("arg=%d\n",arg); arg++; return arg; } int main(int argc, char *argv[]) { GtkWidget *main_window; //主窗口对象 GtkWidget *button; //将要放置到主窗口中的按钮对象 //构造两个变量用于演示GDB功能 gint a=5; gchar *name="Dubuntu-6.06"; // gtk_init(&argc, &argv); main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(main_window), "Hello,Dubuntu2!"); //设置窗口的默认大小(宽200,高度50) gtk_window_set_default_size(GTK_WINDOW(main_window), 200,50); button = gtk_button_new_with_label("退出程序"); gtk_container_add(GTK_CONTAINER(main_window), button); //为"button"连接“单击事件”要调用的回调函数 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(cb_button),NULL); gtk_widget_show(button); gtk_widget_show(main_window); //上边的两句可以合为 gtk_widget_show_all(window) g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(cb_button),NULL); gtk_main(); return 0; } |
编译: gcc -g -Wall -o hello_gdb hello_gdb.c `pkg-config --cflags --libs gtk+-2.0` 注意:-g 参数用于为可执行文件生成调试信息; -Wall 用于在编译程序时打印所有的警告信息 |
gcc -g -Wall -o hello_gdb hello_gdb.c `pkg-config --cflags --libs gtk+-2.0` |
gdb ./hello_gdb |
dubuntu@dubuntu:~/Desktop/gnome-gtk-prog/hello_gtk/src$ gdb ./hello_gdb GNU gdb 6.5.50.20060605-cvs Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1". (gdb) |
小技巧:在gdb命令中,只需要输入命令或参数的前几个字符,再按键盘上的“TAB”键,那gdb将自动补齐命令或参数,如果有多个候选者,那么gdb将把它们都列举出来。 |
注意:如果运行list 命令得到类似如下的打印,那是因为在编译程序时没有加入 -g 选项: (gdb) list 1 ../sysdeps/i386/elf/start.S: No such file or directory. in ../sysdeps/i386/elf/start.S |
gdb ./hello_gdb #启动gdb并载入被调试程序 list gdb_test #显示函数 gdb_test 的代码 break cb_button #在函数 cb_button 处设置断点 info breakpoints #显示所有断点信息 enable breakpoints #启动所有断点 run # 开始运行程序 #注:现在程序正常运行,当单击按钮“退出程序”后,将在函数“cb_button”处停止,因为这里被设置了一个断点 bt #显示当前的函数调用堆栈 display j #对变量 j 进行监视 next #运行下一条指令 print j #显示j的值 print gdb_test(j) #调用函数 gdb_test 并使用 j 作为参数 call gdb_test(++j) #同上 next finish #退出函数 cb_button continue #继续运行完程序 quit # 退出gdb |