linux makefile编写 dump分析 GDB调试 抓包

Linux快速开发

1       Makefile编写... 1

1.1        实例解析... 1

1.1.1         makefile文件... 1

1.1.2         包含的makefile.global 3

1.2        使用makefile文件... 5

2       Linux编译... 5

2.1        Linux编译步骤... 5

3       Linux调试gdb. 6

4       以服务的形式在linux上运行程序... 7

4.1        执行步骤... 7

4.2        安装服务脚本ivmsservice.sh. 8

5       linux抓包tcpdumpwireshark. 18

5.1        安装卸载tcpdump. 18

5.2        tcpdump抓包到文件... 18

5.3        分析抓包文件... 19

6       分析dump文件... 19


 

1          Makefile编写

Makefile 是一种linux编译程序的命令集合;通过makefile对程序进行编译和链接;

1.1          实例解析

1.1.1          makefile文件

下面是一个完整的makefile的实例;

#定义C语言文件编译命令变量,gcc是编译命令 –o0表示禁用优化,后面是参数

CC = gcc -o0

#定义C++文件编译命令变量,g++是编译命令 –o0表示禁用优化,后面是参数

CPP = g++ -o0

#定义make的变量

MAKE = make

#定义去除字符串首尾空格的变量

STRIP = strip

#定义根目录的变量,..表示makefile文件所在目录的上一级

TOP_DIR = ..

#包含文件,像是c++里的头文件,里面有一些定义

include Makefile_cmsws_ass_stub_linux.global

#定义静态库的变量,$(LD_STATIC_LIB)global中的变量

LD_STATIC_LIB := $(LD_STATIC_LIB)

#定义动态库的变量,$( LDLIBS)global中的变量

LDLIBS := $(LDLIBS)   -lgsoap -lhlog -liconv -lssl -lcrypto

#定义生成目标文件,名称和路径

TARGET = $(LIB_DIR)/libcmsws_ass_stub.so

#定义变量生成中间对象文件,

OBJ_DIR := $(TOP_DIR)/obj

#定义创建对象文件夹的命令,shell语句用来判断是否存在,并创建对象文件夹

MAKE_OBJ_DIR := $(shell if [ ! -d $(OBJ_DIR) ]; then mkdir $(OBJ_DIR) ; fi )

#定义创建对象文件夹的子文件的命令,

MAKE_OBJ_SUBDIR := $(shell for sub_dir in $(VPATH); do if [ ! -d $(OBJ_DIR)/$$sub_dir ]; then mkdir $(OBJ_DIR)/$$sub_dir; fi ; done; )

 

#定义源文件变量,$(VPATH)是程序目录,*意思是获取程序目录下的所有文件名,最后得到的就是所有文件名组成的字符串,以空格隔开;

SOURCES := $(foreach dir, $(VPATH), $(wildcard $(dir)/*))

#filet是过滤出所有的c文件名称,筛选出.c文件,也就是C语言文件

C_SRCS  := $(filter %.c, $(SOURCES))

#filet是过滤出所有的c++文件,筛选出C++文件

CPP_SRCS := $(filter %.cpp, $(SOURCES))

#定义源文件变量,所有的C文件和C++文件

 SRCS := $(C_SRCS) $(CPP_SRCS)

#定义对象文件变量,包含所有的对象文件,patsubst是字符串替换函数,将文件名字的后缀都改成.o,表示生成的对象文件的名称patsubst是命令,%.c表示要替换的文件名通配符,%.o表示要替换后的文件名通配符;

OBJS := $(patsubst %, $(OBJ_DIR)/%, $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(SRCS))))

#定义编译规则,目标:源文件  编译命令;生成c语言的对象文件,$(CC)gcc编译命令;格式为  目标($(OBJ_DIR)/%.o):生成目标的源文件(%.c  编译命令($(CC)) 编译参数(-g3 表示加入调试信息,$(CFLAGS)包含一些参数和头文件);如果头文件或者源文件比.o文件要新,则会重新编译;

$(OBJ_DIR)/%.o:%.c

         $(CC)  -g3 -c $(CFLAGS) $< -o $@

#定义编译规则,目标:源文件  编译命令;生成c++的对象文件

$(OBJ_DIR)/%.o:%.cpp

         $(CPP)   -g3 -c $(CPPFLAGS) $< -o $@

#生成目标文件,包含所有的对象文件,动静态库

all: $(OBJS)       

         $(CPP)  -g -shared $(OBJS) -fPIC $(LDFLAGS) $(LDLIBS)  $(LD_STATIC_LIB) -o $(TARGET) 

#生成伪目标文件,用来清除文件不生成真的文件,执行 make –f  Makefilename clean 就会清除生成的目标文件和中间对象文件;

 clean:

         -rm -f $(TARGET) $(OBJS)

1.1.2          包含的makefile.global

CC = gcc

CPP = g++

MAKE = make

STRIP = strip

 

##define inc_dir

#定义工程根目录变量

PROJ_BASE = $(TOP_DIR)

#定义头文件目录变量

INC_DIR   = $(TOP_DIR)/cmsws_alarm_server_service_stub\

         $(TOP_DIR)/cmsws_lib/cmsws  \

         $(TOP_DIR)/cmsws_lib/hlog  \

         $(TOP_DIR)/cmsws_lib/iconv   \

         $(TOP_DIR)/cmsws_platform/windows  \

         $(TOP_DIR)/cmsws_lib/cmsws_ass_stub\

         $(TOP_DIR)/cmsws_alarm_server_service_stub/service_stub \

         $(TOP_DIR)/cmsws_alarm_server_service_stub/ass_stub_interface \

#源文件路径

VPATH+=$(TOP_DIR)/cmsws_platform/windows  $(TOP_DIR)/cmsws_alarm_server_service_stub/service_stub  $(TOP_DIR)/cmsws_alarm_server_service_stub/ass_stub_interface  $(TOP_DIR)/cmsws_alarm_server_service_stub

#set so compile options

#定义so文件的编译的参数变量

SOFLAGS = -shared -fPIC

#-fstack-check -fvisibility=hidden

#定义C文件的编译的参数变量

CFLAGS := $(CFLAGS) -m64 $(SOFLAGS) $(patsubst %, -I%, $(INC_DIR))

#定义C++文件的编译的参数变量

CPPFLAGS := $(CFLAGS) -fPIC -ftemplate-depth-128

#定义动态库的目录变量

LIB_DIR = $(TOP_DIR)/linux_lib_x64

#定义静态库的目录变量

STATIC_LIB_DIR = $(TOP_DIR)/linux_lib_x64

#定义动静态库的编译的参数变量

LDFLAGS := $(LDFLAGS) $(SOFLAGS) -Wl,--hash-style=both -Wl,-Bsymbolic -Wl,--enable-new-dtags -Wl,-rpath,./

LDLIBS := $(LDLIBS) -lpthread -lstdc++ -lrt $(patsubst %, -L%, $(LIB_DIR))

LD_STATIC_LIB := $(LD_STATIC_LIB)  $(patsubst %, -L%, $(STATIC_LIB_DIR))

1.2          使用makefile文件

使用上述makefile文件作为模板,修改源文件目录、头文件目录,生成的目标名称,包含的动静态库,动静态库路径;就可以使用这个模板轻松编译linux程序;

 

 

2          Linux编译

2.1          Linux编译步骤

1)采用secureCRT软件,登陆linux服务器,进入makefile所在文件夹,执行makefile文件。如下图所示;编译中出现错误则根据提示修改;

 

2)编译成功后,程序不一定能够执行;需要执行ldd –r libalarm_logic_unit.so,查看目标文件libalarm_logic_unit.so是否缺少库文件或者未定义的函数;相当于window下的depend工具;

 

根据提示添加缺少的库文件,修改错误,未识别的符号有的是一些乱码,可用下列命令来查看具体的原因;c++filt _ZNSbIhSt11char_traitsIhESaIhEE4_Rep20_S_empty_rep_storageE

 

3)软连接,一些开发者提供的库文件后缀一般是.so.1.0.0的格式,这样makefile无法识别,需要通过ln –s libssl.so.1.0.0 libssl.so  创建软连接libssl.so 指向libssl.so.1.0.0;软连接相当于C++中引用的概念,是个别称;

 

 

3          Linux调试gdb

  1. gdb alarm_logic_unit 。    gdb加程序名称,表示调试该程序;

  2. b 。加函数名称或者 源文件名称:行号,来加断点;

  3. r 。运行程序进行调试;执行到断点处会停住;

  4. p 。变量名称      来查看变量的值;

  5. c 。继续执行到下一个断点;

  6. n 。单步执行;

  7. l 。查看下面要执行的几行代码;

  8. q退出gdb;

 

 

 

4           以服务的形式在linux上运行程序

4.1         执行步骤

1)复制文件工具

WinSCP是一款可视化的文件复制工具,可以方便的将windows系统中的文件复制到linux系统中;如下图所示,现在windows系统中登陆linux系统,然后通过拖动的方式将文件来回复制;

 

2)编写脚本程序

编写六个脚本文件*.sh文件,文件的内容如下;./ivmsservice.sh是安装卸载服务的文件,待会介绍;

安装服务脚本install.sh./ivmsservice.sh install alarm_logic_unit

卸载服务脚本uninstall.sh./ivmsservice.sh uninstall alarm_logic_unit

启动服务脚本start.shservice alarm_logic_unit start

停止服务脚本stop.shservice alarm_logic_unit stop

服务状态脚本status.shservice alarm_logic_unit status

重启服务脚本restart.shservice alarm_logic_unit restart

3)转换文件格式,在windows环境下编写的文件在linux下执行会因为换行符的不同而无法执行,window下是/n/rlinux下是/n,所以需要进行格式转换;先用命令:sudo yum install dos2unix 下载安装dos2unix程序;然后在用dos2unix *.sh命令转换所有的sh文件格式;

4)先执行安装脚本,在执行启动脚本,再用命令ps –ef 显示电脑的进程,看是否都安装启动成功;执行statu.sh脚本查看状态,执行stop.sh 停止服务,执行uninstall.sh卸载服务;如果无法停止服务,可以用kill 进程id12897)命令,通过进程id号杀死进程;

 

你可能感兴趣的:(linux makefile编写 dump分析 GDB调试 抓包)