C与C++区别
gcc .cpp -> c++语法 编译 不能链接c++库
.c ->c语法
g++ .cpp 都通过c++语法编译
.c
预编译 编译 汇编 链接(《程序员自我修养》中有总结)
预编译
gcc -E main.c -o mian.i
删除注释,进行宏替换,增加行号及文件名标识,处理所有条件的预编译指令,保留所有的#pragma指令
编译
gcc -S main.i -o main.s
将预处理完的文件进行一些列的词法、语法、语义分析及优化生成汇编代码
汇编
gcc -c main.s -o main.o
汇编器将所有的汇编代码转化为汇编指令
gcc -o main main.o
生成可执行程序
linux 可执行程序格式 ELF 格式
windows 可执行程序格式 PE 格式
机器指令 101001
汇编代码 mov
高级语言c/c++
linux虚拟地址空间相关面试题 在《c专家编程》5 6 7章 《 程序员自我修养》
makefile
makefile文件 管理工程 实现自动化编译
add.c max.c main.c
all: main 最终生成的程序
main: main.o max.o add.o 依赖关系
gcc -o main main.o max.o add.o 生成规则
main.o:main.c
gcc -c main.c
max.o:max.c
gcc -c max.c
add.o:add.c
gcc-c add.c
gdb
l 显示代码
b 加断点
info break 查看断点信息
delete+断点编号 删除断点
r 运行程序
n 单步执行
p 打印
s 进入函数
finish 退出函数
c 继续执行
display 连续打印
bt 显示函数栈调用信息
多进程调试
(gdb) attach +pid 添加调试进程
set follow-fork-mode child/parent 设置跟踪子进程或父进程
多线程调试
info threads - 显示可以调试的线程
thread id 切换到指定线程
set scheduler-locker-locking off on step
off 不锁定,所有线程都可以执行
on 锁定 只有当前线程可以执行
step 单步执行时只有当前线程执行
core 调试
如何检测内存泄漏
程序崩溃时 生成core文件 -》快速找到出错的地方
所程序是逻辑错误,没有崩溃core找不到
ulimit -a 可以查看core文件 0表示未开启
ulimit -c +size 设置core文件大小上限
strace 跟踪系统调用
ltrace 跟踪库函数