1 调试一般分为两种方法
可以通过在程序中插入打印语句。有点能够显示程序的动态过程,比较容易的检查出源程序中的有关信息。缺点就是效率比较低了,而且需要输入大量无关的数据。
2 借助相关的调试工具。
gdb
3 有哪些常用的调试工具呢?
3.1 strace
(1)我们知道在进行创建文件或者复制文件这些操作的时候,应用程序需要和操作系统进行一些交互。但是我们的程序一般不能直接访问linux的内核。但是应用程序会跳转到system_call的内核位置,内核然后检查系统的调用号,然后这个号码告诉内核需要什么服务。这就是所谓的"系统调用"
(2)认识starce
然后.g++ -o debug debug.cpp
strace ./debug就会出现如下图内容(部分截图,小伙伴可以通过试试查看更详细的内容)
等号左边为系统调用的函数名及其参数,右边为返回值。通过上面部分的分析我们可以知道会自动调用很多函数用于进程初始化工作比如装载被执行程序,载入libc函数库,设置内存映射等。
(3) 统计系统调用
通过加上-c的做统计分析。比如strace -c ./debug.另外-o将结果输出到文件。-T将每个系统调用所花费的时间打印出来。-t.-tt等可以记录每次系统调用发生的时间。
3.2 gdb
(1)认识gdb
a:启动程序可以按照用户自定义的要求随心所欲的运行程序
b:可以被调试的程序在指定的断点挺住
c:当程序停住时候可以检查程序的运行状态
d:动态的改变程序的执行环境
(2)gdb常用方法
a:程序如下
1 #include<iostream> 2 using namespace std; 3 4 int func(int n) 5 { 6 int result = 0; 7 for(int i=1;i<=n;i++) 8 { 9 result+=i; 10 } 11 return result; 12 } 13 14 int main() 15 { 16 int arr[10]; 17 arr[0] = 0; 18 arr[1] = 1; 19 for(int i=2;i<10;i++) 20 { 21 arr[i]=arr[i-1]+arr[i-2]; 22 23 } 24 cout<<"arr[9]"<<arr[9]<<endl; 25 cout<<"func(9)"<<func(9)<<endl; 26 return 0; 27 }