Linux学习日记7——GDB调试
黑马程序员-Linux系统编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1KE411q7ee?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click目录一、C程序代码二、GDB调试2.1 编译文件2.2 进入GDB调试2.3 GDB中打印源码2.4 设置断
·
目录
一、C程序代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
char *str = "hello";
int var = 0;
void init_arr(int *arr, int len)
{
int i = 0;
for(i = 0; i < len; i++) {
arr[i] = rand() % 20 + 1;
}
}
void select_sort(int *arr, int len)
{
int i, j, k, temp;
for(int i = 0; i < len - 1; i++) {
k = i;
for(j = i+1; j < len; j++) {
if(arr[k] > arr[j])
k = j;
}
if(i != k) {
temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
}
void print_arr(int *arr, int len)
{
int i;
for(i = 0; i < len; i++)
{
printf("arr[%d] = %d\n", i, arr[i]);
}
}
int main(void)
{
int arr[N];
char *p = "hello";
srand(time(NULL));
init_arr(arr, N);
print_arr(arr, N);
select_sort(arr, N);
printf("-----after sort----");
print_arr(arr, N);
return 0;
}
二、GDB调试
2.1 编译文件
# -g 包含调试信息
gcc gdbtest.c -o gdbtest -g
2.2 进入GDB调试
gdb gdbtest
2.3 GDB中打印源码
# 使用 list 或者简写 l
# list(l) 1 表示从第一行开始打印
# list(l) 继续显示上面没显示完的代码
2.4 设置断点
# 使用 break 或者简写 b
# break(b) 行号
2.5 运行程序
# 使用 run 或者简写 r
2.6 继续执行
# next 越过函数 简写为 n
# s 执行函数
# 系统函数只能用 n 跳过
2.7 查看变量值
# print 输出变量值 简写为 p
# print(p) 变量值
2.8 继续执行到下一个断点
# continue
2.9 退出
# quit
三、gdb调试其他命令
3.1 段错误调试方法
修改代码
编译运行发现报错了:
编译包含调试文件的可执行文件,进入 gdb 调试
直接跑程序 run,发现在 56 行停下来了,找到出错的位置
3.2 finish
finish:结束当前函数调用(回到调用该函数的位置往下执行)
3.3 带参数的 main 函数
修改代码:
运行程序:
gdb 中添加 main 函数的参数:
第一种方法:
set 参数名 参数值
# 注意要在函数运行前设置
第二种方法:
run 字符串1 字符串2 ...
3.4 查看断点信息
info b
设置条件断点,并查看
3.5 查看变量类型
ptype 变量名
# 注意:这个只能查看到当前运行的函数内有的变量,不能查看main函数内的变量,除非传递进来的参数
栈帧:随着函数调用而在stack上开辟的一片内存空间。用于存放函数调用时产生的局部变量和临时值。
在 init_arr 中有的参数才能被 ptype 访问
3.6 函数的栈帧操作
backtrace 简称 bt 查看函数的调用的栈帧和层级关系
frame 简称 f 切换函数的栈帧
还能使用 ptype 0 切换回来
3.7 display 设置观察变量
设置一个
如果想设置两个的话,继续使用:display 变量名
取消设置跟踪变量的话可以使用 undisplay 编号
3.8 在 gdb 中打开新的调试代码
file gdbtest
四、gdb常见错误说明
4.1 错误一
(gdb) list
没有符号表被读取。请使用 “file” 命令。
解决方法
需要在后面加上 -g 编译一下
gcc gdbtest.c -o gdbtest -g
更多推荐
已为社区贡献1条内容
所有评论(0)