赞
踩
在大型的嵌入式软件中,一般会分模块的进行开发,最终某个模块的部分会以动态库的方式给出来给需要的人调用,一般有动态库和
静态库的方式,但是静态库的占用内存太大,我们一般用动态库的方式开发。
gcc demo.c -o demo.o -fPIC
gcc -shared demo.o -o libdemo.so //生成 libdemo.so动态库文件
mkdir include ; mkdir lib ; mv demo.h include/ ; mv libdemo.so lib/
gcc main.c -ldemo -o main -I./include -L./lib
//运行可执行文件时需要指定动态库的路径
export LD_LIBRARY_PATH=./lib
demo.h头文件
#ifndef _DEMO_H_
#define _DEMO_H_
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int add1(int a, int b);
int sub1(int a, int b);
int div1(int a, int b);
#endif
demo.c源文件
#include "demo.h" int add1(int a, int b) { return a + b; } int sub1(int a, int b) { return a - b; } int div1(int a, int b) { return a /b; }
main.c源文件
#include "demo.h"
int main(int argc, char *argv[])
{
int a = 20, b = 4;
printf("%s %s\n", argv[1], argv[2]);
printf("%d + %d = %d\n",a, b, add1(a, b));
printf("%d - %d = %d\n",a, b, sub1(a, b));
printf("%d / %d = %d\n",a, b, div1(a, b));
return 0;
}
GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。我们在编译程序的时候需要加上 -g 选项,系统会在编译的时候加上调试信息
命令 | 命令缩写 | 作用 |
---|---|---|
gdb + 可执行文件 | 使用gdb调试目标程序 | |
run | r | 运行程序 |
break + n | b | 设置断点 |
start | 运行至主函数的起始位置停下 | |
step | s | 单步执行,遇到函数会进入 |
next | n | 单步执行,遇到函数不会进入 |
run + 参数 | 执行程序带入参数运行 | |
set args + 参数 | 设置带入参数的值 | |
finish | fi | 结束当前函数调用,回到上一层函数处 |
backtrace | bt | 查看当前线程调用的堆栈(栈帧) |
frame | f + n | 切换到具体的堆栈处 |
list | l | 查看调试源码 |
info b | i + b | 查看断点信息 |
show args | 显示带入参数的值 | |
break +n if var = n | 设置断点,并且设置循环的变量 | |
delete + n | 删除断点(使用info break 显示的断点编号) | |
continue | 出发断点后程序继续运行 | |
disable + n | 禁用某个断点 | |
enable + n | 使能某个断点 | |
until | 程序执行到指定位置停下来 | |
ptype var | 查看变量类型 | |
display var | 一直跟踪变量var | |
undisplay + 跟踪变量编号 | 取消跟踪变量var | |
quit | q | 退出gdb调试 |
打印变量值和类型时,需要运行到某个函数的栈帧上查看
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。