研发中学习C(file函数、宏定义、gdb调试、strstr函数)

简介: 研发中学习C(file函数、宏定义、gdb调试、strstr函数)

file文件函数


file:

file的 fwrite函数:

(1) 调用格式:fwrite(buf, sizeof(buf), 1, fp);

成功写入返回值为1(即count)

(2)调用格式:fwrite(buf, 1, sizeof(buf), fp);

成功写入则返回实际写入的数据个数(单位为Byte)

所以可以用返回值与sizeof(buf)进行比较,来判断是否完成了全部写入。


宏定义


.h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。

对于宏定义,在gdb调试中值一般不可见,在编译时加入-gdwarf-2 -g3参数,可使宏定义的值可查看。


gcc -g -gdwarf-2 -g3 test.c -o test 将宏定义加进去编译


gdb调试


学习gdb调试

起到一个监控的作用。

在程序执行过程中,可以改变某个变量的值,以及代码执行顺序,从而修改逻辑错误。

基本的gdb参数

-g : 使用这个参数编译可执行文件,得到调试表
gdb ./temp
list : list 1(选定的中心行)
b : b 20 (选定的断点,还没执行这一行程序就暂停)
run/r : 执行程序
n/next : 下一条指令(会越过函数)
s/step : 下一条指令(会进入函数)
p/print : p i (查看变量i的值)
continue : 继续执行断点后续指令
quit : 退出gdb当前调试

ctrl + x + a 快捷键可以浏览当前所在代码上下几行。

在gdb运行中,可以使用set将变量的值进行修改,可以查看自己期待得到的结果。


查看内存地址指向的内容

同时,得到一个地址时,使用 x/20 + 地址 命令可以查看当前地址存放的20个字节存放的内容。


跳过当前函数

对于想跳过的函数可以使用finish命令。


跳过当前循环

对于想跳过的循环可以使用until命令。


保存gdb输出信息到日志

在实际工作中,常常会使用gdb命令,有时为了后续查看方便,可以将gdb的输出信息打印到特定文件中。

具体操作如下:


(gdb) set logging file fileName 设置文件名,文件默认生成在运行gdb命令的目录下;

(gdb) set logging on 启动日志记录;

(gdb) set height 0 这样gdb需要多行输出时,就会全部输出,中间不会暂停;

(gdb) set print elements 0 这样gdb在打印时就没有默认为200个元素的长度限制;

(gdb) thread apply all bt 在这里去实际操作,所需要的gdb命令

(gdb) set logging off


字符串函数


strstr()函数用于找到子串在一个字符串中第一次出现的位置,在string.h头文件中。

sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。


共同体


union 共用体名{
    成员列表
};

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。


结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。




相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
2月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
50 10
|
2月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
2月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
35 0
|
4月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
34 1
|
4月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
25 0
|
4月前
|
NoSQL Linux C++
Linux C/C++ gdb调试正在运行的程序
Linux C/C++ gdb调试正在运行的程序
|
4月前
|
NoSQL Linux C++
Linux C/C++ gdb调试core文件
Linux C/C++ gdb调试core文件
|
4月前
|
NoSQL Linux C++
Linux C/C++ gdb调试
Linux C/C++ gdb调试
|
5月前
|
NoSQL Ubuntu 测试技术
【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情
【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情
81 1
|
5月前
|
NoSQL 编译器 C语言
【GDB调试技巧】提高gdb的调试效率
【GDB调试技巧】提高gdb的调试效率
64 1