标签:obj 执行文件 repeat object-c c++ user 部分 函数名 一段
GDB是GNU项目调试器,支持C、C++、Go、Fortran、Object-C、Assembly等。能够暂停程序运行,调试程序(包括本地调试、远程调试),如何远程调试我将在之后的文章中写道,本篇只讨论基本用法。
首先准备gdb调试环境:-g参数
$ gcc -g *.c $ ls a.out a.out.dSYM
-g参数让编译器在生成可执行文件a.out时加入调试信息(在a.out.dSYM目录下)
启动gdb
$ gdb a.out GNU gdb (GDB) 8.0.1 Copyright (C) 2017 Free Software Foundation, Inc. ... (gdb)
现在我们进入了gdb的调试界面
熟悉几个基本命令:
下面有一段程序
main.c
1 #include <stdio.h> 2 #include "func.h" 3 4 int main() 5 { 6 char str[] = "This is a test."; // line 6 7 int len = myStrlen(str); 8 printf("len:%d\n", len); 9 10 return 0; 11 }
func.c
1 int myStrlen(const char *str) 2 { 3 int len = 0; 4 const char *p = str; 5 while (*p != ‘\0‘) { 6 ++len; 7 ++p; 8 } 9 return len; 10 }
在main.c第6行设置断点(想在main.c中给func.c设置断点输入b func.c:3)
(gdb) b 6 Breakpoint 1 at 0x100000f11: file main.c, line 6.
开始调试,程序自动暂停在第6行(此行即将执行,str尚未赋值)
(gdb) r Starting program: /Users/mgrwang/Dev/test/a.out Breakpoint 1, main () at main.c:6 6 char str[] = "This is a test."; (gdb) p str $1 = ‘\000‘ <repeats 15 times>
向下执行,程序运行到第7行
(gdb) n 7 int len = myStrlen(str); (gdb) p str $3 = "This is a test."
输入s进入函数体myStrlen,如果想继续执行不查看函数,输入n执行下一行
(gdb) s myStrlen (str=0x7fff5fbff980 "This is a test.") at func.c:3 3 int len = 0;
查看程序执行位置附近代码
(gdb) l 1 int myStrlen(const char *str) 2 { 3 int len = 0; 4 const char *p = str; 5 while (*p != ‘\0‘) { 6 ++len; 7 ++p; 8 } 9 return len; 10 }
(省略部分执行细节)
观察变量p值变化
(gdb) watch *p Hardware watchpoint 3: *p Old value = 84 ‘T‘ New value = 104 ‘h‘
退出调试
(gdb) watch *p Hardware watchpoint 3: *p Old value = 84 ‘T‘ New value = 104 ‘h‘
标签:obj 执行文件 repeat object-c c++ user 部分 函数名 一段
原文地址:https://www.cnblogs.com/wangyubjhd/p/10281417.html