重庆制作网站公司简介,网络专业的网站建设价格,做一个网站只做前端怎么做,类似优酷网站建设价格#xff08;GUI调试器#xff1a;insight和ddd#xff09;  list(l) #xff1a;其作用就是列出程序的源代码#xff0c;默认每次显示10行。  list 行号#xff1a;将显示当前文件以“行号”为中心的前后10行代码#xff0c;如#xff1a;list 12 list 行号1,行号2: 将… GUI调试器insight和ddd  list(l) 其作用就是列出程序的源代码默认每次显示10行。  list 行号将显示当前文件以“行号”为中心的前后10行代码如list 12 list 行号1,行号2: 将显示行号1与行号2之间的代码 list 函数名将显示“函数名”所在函数的源代码如list main list 不带参数将接着上一次 list 命令的输出后续的代码。 set args设置运行程序时的命令行参数如set args 33 55 show args显示命令行参数 break(b)为程序设置断点。   break 行号在当前文件的“行号”处设置断点如break  33 break filename:line-number在指定文件的指定行设置断点  break 函数名在用户定义的函数“函数名”处设置断点如break cb_button info b number1,number2 …… 显示指定断点信息;info b (显示所有断点信息)   disable b Num关闭断点“Num”使其无效其中“Num”为 info breakpoints 中显示的对应值 disable b(禁用所有断点) enable b Num打开断点“Num”使其重新生效 enable b (启用所有断点) clear linenumber:清除指定行上的所有断点    until当你厌倦了在一个循环体内单步跟踪时这个命令可以运行程序直到退出循环体。  backtrace(bt) where显示当前程序的函数调用堆栈。  watch 表达式设置一个监视点一旦被监视的“表达式”的值改变gdb将强行终止正在被调试的程序。如 watch a layout用于分割窗口可以一边查看代码一边测试   layout src显示源代码窗口 layout asm显示反汇编窗口 layout regs显示源代码/反汇编和CPU寄存器窗口 layout split显示源代码和反汇编窗口 Ctrl  L刷新窗口  set variablevalue:将值赋予变量   本文写给主要工作在Windows操作系统下而又需要开发一些跨平台软件的程序员朋友以及程序爱好者。 GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 GDB中的命令固然很多但我们只需掌握其中十个左右的命令就大致可以完成日常的基本的程序调试工作。 命令 解释 示例file 文件名加载被调试的可执行程序文件。 因为一般都在被调试程序所在目录下执行GDB因而文本名不需要带路径。(gdb) file gdb-samplerrun的简写运行被调试的程序。 如果此前没有下过断点则执行完整个程序如果有断点则程序暂停在第一个可用断点处。(gdb) rccontinue的简写继续执行被调试程序直至下一个断点或程序结束。(gdb) cb 行号 b 函数名称 b *函数名称 b *代码地址  d [编号] b:  break的简写设置断点。两可以使用“行号” “函数名称” “执行地址”等方式指定断点位置。 其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。如果不了解汇编可以不予理会此用法。  d: delete breakpoint的简写删除指定编号的某个断点或删除所有断点(d b)。断点编号从1开始递增。 (gdb) b 8 (gdb) b main (gdb) b *main (gdb) b *0x804835c  (gdb) d  s finish n s: step的简写执行一行源程序代码如果此行代码中有函数调用则进入该函数 n: next的简写执行一行源程序代码此行代码中的函数调用也一并执行。  s 相当于其它调试器中的“Step Into (单步跟踪进入)”VS的F11  Step Out, VS的SHIFTF11 n 相当于其它调试器中的“Step Over (单步跟踪)”。VS的F10  这两个命令必须在有源代码调试信息的情况下才可以使用GCC编译时使用“-g”参数。 (gdb) s (gdb) n si ni si命令类似于s命令ni命令类似于n命令。所不同的是这两个命令si/ni所针对的是汇编指令而s/n针对的是源代码。(gdb) si (gdb) nip 变量名称print的简写显示指定变量临时变量或全局变量的值。(gdb) p i (gdb) p nGlobalVardisplay...  undisplay 编号 display设置程序中断后欲显示的数据及其格式。 例如如果希望每次程序中断后可以看到即将被执行的下一条汇编指令可以使用命令 “display /i $pc” 其中 $pc 代表当前汇编指令/i 表示以十六进行显示。当需要关心汇编代码时此命令相当有用。  undispaly取消先前的display设置编号从1开始递增。 (gdb) display /i $pc  (gdb) undisplay 1 iinfo的简写用于显示各类信息详情请查阅“help i”。(gdb) i rqquit的简写退出GDB调试环境。(gdb) qhelp [命令名称]GDB帮助命令提供对GDB名种命令的解释说明。 如果指定了“命令名称”参数则显示该命令的详细说明如果没有指定参数则分类显示所有GDB命令供用户进一步浏览和查询。(gdb) help display 废话不多说下面开始实践。 先给出一个示例用的小程序C语言代码简单的不能再简单了 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33   //此程序仅作为“GDB十分钟教程”的示例代码 //Email: //blog:  //WebSite:  #include stdio.h  int nGlobalVar  0;  int tempFunction(int a, int b) {     printf(tempFunction is called, a  %d, b  %d \n, a, b);     return (a  b); }  int main() {     int n;     n  1;     n;     n--;      nGlobalVar  100;     nGlobalVar - 12;      printf(n  %d, nGlobalVar  %d \n, n, nGlobalVar);      n  tempFunction(1, 2);     printf(n  %d, n);      return 0; }   请将此代码复制出来并保存到文件 gdb-sample.c 中然后切换到此文件所在目录用GCC编译之 
gcc gdb-sample.c -o gdb-sample -g 在上面的命令行中使用 -o 参数指定了编译生成的可执行文件名为 gdb-sample使用参数 -g 表示将源代码信息编译到可执行文件中。如果不使用参数 -g会给后面的GDB调试造成不便。当然如果我们没有程序的源代码自然也无从使用 -g 参数调试/跟踪时也只能是汇编代码级别的调试/跟踪。 下面“gdb”命令启动GDB将首先显示GDB说明不管它 
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) Copyright 2003 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 i386-redhat-linux-gnu. (gdb)  上面最后一行“(gdb) ”为GDB内部命令引导符等待用户输入GDB命令。 下面使用“file”命令载入被调试程序 gdb-sample这里的 gdb-sample 即前面 GCC 编译输出的可执行文件 
(gdb) file gdb-sample Reading symbols from gdb-sample...done. 上面最后一行提示已经加载成功。 下面使用“r”命令执行Run被调试文件因为尚未设置任何断点将直接执行到程序结束 
(gdb) r Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample n  1, nGlobalVar  88 tempFunction is called, a  1, b  2 n  3 Program exited normally. 下面使用“b”命令在 main 函数开头设置一个断点Breakpoint 
(gdb) b main Breakpoint 1 at 0x804835c: file gdb-sample.c, line 19. 上面最后一行提示已经成功设置断点并给出了该断点信息在源文件 gdb-sample.c 第19行处设置断点这是本程序的第一个断点序号为1断点处的代码地址为 0x804835c此值可能仅在本次调试过程中有效。回过头去看源代码第19行中的代码为“n  1”恰好是 main 函数中的第一个可执行语句前面的“int n;”为变量定义语句并非可执行语句。 再次使用“r”命令执行Run被调试程序 
(gdb) r Starting program: /home/liigo/temp/gdb-sample  Breakpoint 1, main () at gdb-sample.c:19 19 n  1; 程序中断在gdb-sample.c第19行处即main函数是第一个可执行语句处。 上面最后一行信息为下一条将要执行的源代码为“n  1;”它是源代码文件gdb-sample.c中的第19行。 下面使用“s”命令Step执行下一行代码即第19行“n  1;” 
(gdb) s 20 n; 上面的信息表示已经执行完“n  1;”并显示下一条要执行的代码为第20行的“n;”。 既然已经执行了“n  1;”即给变量 n 赋值为 1那我们用“p”命令Print看一下变量 n 的值是不是 1  
(gdb) p n $1  1 果然是 1。$1大致是表示这是第一次使用“p”命令——再次执行“p n”将显示“$2  1”——此信息应该没有什么用处。 下面我们分别在第26行、tempFunction 函数开头各设置一个断点分别使用命令“b 26”“b tempFunction” 
(gdb) b 26 Breakpoint 2 at 0x804837b: file gdb-sample.c, line 26. (gdb) b tempFunction Breakpoint 3 at 0x804832e: file gdb-sample.c, line 12. 使用“c”命令继续Continue执行被调试程序程序将中断在第二个断点26行此时全局变量 nGlobalVar 的值应该是 88再一次执行“c”命令程序将中断于第三个断点12行tempFunction 函数开头处此时tempFunction 函数的两个参数 a、b 的值应分别是 1 和 2 
(gdb) c Continuing.  Breakpoint 2, main () at gdb-sample.c:26 26 printf(n  %d, nGlobalVar  %d /n, n, nGlobalVar); (gdb) p nGlobalVar $2  88 (gdb) c Continuing. n  1, nGlobalVar  88  Breakpoint 3, tempFunction (a1, b2) at gdb-sample.c:12 12 printf(tempFunction is called, a  %d, b  %d /n, a, b); (gdb) p a $3  1 (gdb) p b $4  2 上面反馈的信息一切都在我们预料之中哈哈~~~ 再一次执行“c”命令Continue因为后面再也没有其它断点程序将一直执行到结束 
(gdb) c Continuing. tempFunction is called, a  1, b  2 n  3 Program exited normally. 有时候需要看到编译器生成的汇编代码以进行汇编级的调试或跟踪又该如何操作呢 这就要用到display命令“display /i $pc”了此命令前面已有详细解释 
(gdb) display /i $pc (gdb)  此后程序再中断时就可以显示出汇编代码了 
(gdb) r Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample  Breakpoint 1, main () at gdb-sample.c:19 19 n  1; 1: x/i $pc 0x804835c main16: movl $0x1,0xfffffffc(%ebp) 看到了汇编代码“n  1;”对应的汇编代码是“movl $0x1,0xfffffffc(%ebp)”。 并且以后程序每次中断都将显示下一条汇编指定“si”命令用于执行一条汇编代码——区别于“s”执行一行C代码 
(gdb) si 20 n; 1: x/i $pc 0x8048363 main23: lea 0xfffffffc(%ebp),%eax (gdb) si 0x08048366 20 n; 1: x/i $pc 0x8048366 main26: incl (%eax) (gdb) si 21 n--; 1: x/i $pc 0x8048368 main28: lea 0xfffffffc(%ebp),%eax (gdb) si 0x0804836b 21 n--; 1: x/i $pc 0x804836b main31: decl (%eax) (gdb) si 23 nGlobalVar  100; 1: x/i $pc 0x804836d main33: addl $0x64,0x80494fc 接下来我们试一下命令“b *函数名称”。 为了更简明有必要先删除目前所有断点使用“d”命令——Delete breakpoint 
(gdb) d Delete all breakpoints? (y or n) y (gdb) 当被询问是否删除所有断点时输入“y”并按回车键即可。 下面使用命令“b *main”在 main 函数的 prolog 代码处设置断点prolog、epilog分别表示编译器在每个函数的开头和结尾自行插入的代码 
(gdb) b *main Breakpoint 4 at 0x804834c: file gdb-sample.c, line 17. (gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample  Breakpoint 4, main () at gdb-sample.c:17 17 { 1: x/i $pc 0x804834c main: push %ebp (gdb) si 0x0804834d 17 { 1: x/i $pc 0x804834d main1: mov %esp,%ebp (gdb) si 0x0804834f in main () at gdb-sample.c:17 17 { 1: x/i $pc 0x804834f main3: sub $0x8,%esp (gdb) si 0x08048352 17 { 1: x/i $pc 0x8048352 main6: and $0xfffffff0,%esp (gdb) si 0x08048355 17 { 1: x/i $pc 0x8048355 main9: mov $0x0,%eax (gdb) si 0x0804835a 17 { 1: x/i $pc 0x804835a main14: sub %eax,%esp (gdb) si 19 n  1; 1: x/i $pc 0x804835c main16: movl $0x1,0xfffffffc(%ebp) 此时可以使用“i r”命令显示寄存器中的当前值———“i r”即“Infomation Register” 
(gdb) i r eax 0xbffff6a4 -1073744220 ecx 0x42015554 1107383636 edx 0x40016bc8 1073834952 ebx 0x42130a14 1108544020 esp 0xbffff6a0 0xbffff6a0 ebp 0xbffff6a8 0xbffff6a8 esi 0x40015360 1073828704 edi 0x80483f0 134513648 eip 0x8048366 0x8048366 eflags 0x386 902 cs 0x23 35 ss 0x2b 43 ds 0x2b 43 es 0x2b 43 fs 0x0 0 gs 0x33 51 当然也可以显示任意一个指定的寄存器值 
(gdb) i r eax eax 0xbffff6a4 -1073744220 最后一个要介绍的命令是“q”退出QuitGDB调试环境 
(gdb) q The program is running. Exit anyway? (y or n) y