1. 程式人生 > >Linux編譯動態庫和gdb除錯命令

Linux編譯動態庫和gdb除錯命令

Linux編譯動態庫和gdb除錯命令TOC
IPC命令:

拷貝到當前目錄:
cp …/day01/cleanipc .

清除ipc命令:
cleanipc zhidao101 all

檢視網路連線:
netstat -an | grep 8001

檢視使用者程序:
ps -u zhidao101

執行資料夾壓縮命令:
tar zcvf dm_01.tar.gz dm_01/ 生成dm_01.tar.gz

如果從伺服器上傳下載tar.gz 使用二進位制方式

動態庫:

檢視檔案許可權:
ls -lt

檢視使用者空間動態庫、標頭檔案:
ls /usr/lib 動態庫檔案.so
ls /usr/local/lib
ls /usr/include
ls /usr/local/include

連結外部庫:
gcc -Wall a.c -o a.exe -lm 連結libm.so或者libm.a

檢視程式連結的庫:
ldd a.exe

把命令變成指令碼:
複製gcc -Wall a.c -o a.exe -lm 到mygcc檔案

修改檔案許可權:
chmod u+x mygcc
chmod 775 mygcc

靜態庫生成:

  1. touch myadd.h myadd.c
  2. vi myadd.c
    #include<stdio,h>
    #include<string.h>
    #include<stdlib.h>
    #include “myadd.h”
    int myadd(int a,int b)
    {
    int c=0;c=a+b;return c;
    }
  3. vi myadd.h
    extern int myadd(int a,int b);
  4. vi mygcca
    gcc -c myadd.c -o myadd.o
    ar rcs libmyadd.a myadd.o #ar是歸檔工具,rcs打包
    chmod 775 mygcca
  5. ./mygcca 生成libmyadd.a檔案

檢視檔案的屬性:
file libmyadd.a

檢視檔案的函式描述:
nm libmyadd.a

呼叫靜態庫:

  1. vi main.c
    #include<stdio,h>
    #include<string.h>
    #include<stdlib.h>
    #include “myadd.h”
    int main(void)
    {
    printf(“myadd:%d\n”,myadd(3,4));
    return 0;
    }
  2. gcc -L. main.c -o main.exe -lmyadd #-L指定靜態庫目錄
  3. ./main.exe

把命令變成指令碼:
複製gcc -L. main.c -o main.exe -lmyadd到mygcctest檔案
chmod 775 mygcctest

遞迴複製資料夾:
cp day02 day03 -r

移動所有標頭檔案到inc,所有原始檔到src
mv *.h ./inc
mv *.h ./src

gcc常用編譯選項:
-o 產生可執行檔案
-c 編譯原始碼
-E 預編譯
-S 產生彙編
-Wall 發出警告
-ldir dir加入標頭檔案搜尋路徑
-Ldir dir加入庫搜尋路徑
-llib 連結lib庫
-g 嵌入除錯資訊

從目錄編譯靜態庫:
vi mygcca
gcc -c -I./inc ./src/myadd.c -o myadd.o
ar rcs libmyadd.a myadd.o

從目錄呼叫靜態庫:

  1. ls test==> mygcctest main.c libmyadd.a
  2. vi mygcctest
    gcc -L. -I…/inc main.c -o main.exe
  3. tail mygcctest
    rm libmyadd.a #可執行程式生成之後就可以脫離靜態庫

動態庫生成:
vi mygccso
gcc -shared -fPIC -I./inc ./src/myadd.c -o libmyadd.so #-fPIC搜尋與路徑無關

檢視檔案的函式描述:
nm libmyadd.so | grep “myadd”

呼叫動態庫:

  1. vi mygcctest
    gcc -L. -I…/inc main.c -o main.exe -lmyadd
  2. ls libmyadd.so main.c mygcctest
  3. ./mygcctest

檢視程式連結的庫(動態庫和靜態庫):
ldd main.exe

檢視檔案屬性:
file main.exe

動態庫和靜態庫編譯的時候,可以把動態庫和靜態庫copy到gcc指令碼的目錄下
gcc能找到動態庫和靜態庫

動態庫配置路徑:

  1. 拷貝.so到系統共享庫目錄下/usr/lib
    cp libmyadd.so $HOME/lib
  2. vi .bash_profile
    新增:LD_LIBRARY_PATH=.:$HOME/lib:/usr/lib
    export LD_LIBRARY_PATH
  3. source .bash_profile

檢視環境變數:
env | grep LD*

終端用use+pwd登入伺服器,伺服器會為使用者執行一個shell
這個shell的配置檔案$(HOME)/.bash_profile
預設使用/bin/bash
檢視環境變數:
echo $PATH
echo $SHELL
檢視環境變數的設定:
env

修改shell執行的配置檔案,我們需要重新執行配置檔案
source .bash_profile
任何目錄下執行cd命令 都會轉到$HOME

socket專案編譯動態庫:
ls mysocket_so_test
bin etc inc lib log makefile mysocketexe src test

ls inc
itcast_comm.h itcastlog.h socketclientadd.h

ls src
demo01_tesplatfrom.c ticastlog.c socketclient.c

vi makefile
WORKDIR=.

VPATH = ./src

LIBOBJS= socketclient.o itcastlog.o

OBJS= demo01_testplatform.o

LIB1 = libmysocket.so

EXE1 = mysocketexe

CC = gcc

CFLGS= -Wall -g -I$(WORKDIR)/inc/

LIBFLAG = -L$(HOME)/lib

all: $(LIB1) $(EXE1)

( L I B 1 ) : (LIB1): (LIBOBJS)

$(CC) -shared -fPIC $^ -o [email protected]

cp  $(LIB1) $(HOME)/lib

mv  $(LIB1) ./lib

( E X E 1 ) : (EXE1): (OBJS)

$(CC)  $^ $(LIBFLAG) -lmysocket  -o [email protected]

.c.o:

$(CC) $(CFLGS) -c $< -o [email protected]  -shared -fPIC

clean:

rm -rf $(BIN) *.o $(HOME)/lib/$(LIB1) ./$(LIB1) 

檢視程式的記憶體大小:
size mysocketexe

檢視程式的函式描述:
strings mysocketexe

gdb除錯選項:
r 執行
l 列出原始碼
b 設定斷點
ib 檢視斷點資訊
c 繼續執行至下一個斷點
watch 設定觀察點
s 單步跟蹤,進入函式
n 單步跟蹤,不進入函式
finish 執行函式,直到返回
u 退出迴圈

除錯程式:
gdb mysocketexe

b main
b 20
info break
run
n
s
print handle #型別 地址
finish
quit

查詢除錯檔案core
ls -lt | grep “core”

設定檔案大小限制:
ulimit -c 3000

開啟除錯資訊:
gdb dem01 core.13973

工程專案方法,組織src和inc編譯動態庫和靜態庫:
1.c 2.c 3.c ====>src
1.h 2.h 3.h >inc
libsocket.so
>lib

IPC命令:

拷貝到當前目錄:
cp …/day01/cleanipc .

清除ipc命令:
cleanipc zhidao101 all

檢視網路連線:
netstat -an | grep 8001

檢視使用者程序:
ps -u zhidao101

執行資料夾壓縮命令:
tar zcvf dm_01.tar.gz dm_01/ 生成dm_01.tar.gz

如果從伺服器上傳下載tar.gz 使用二進位制方式

動態庫:

檢視檔案許可權:
ls -lt

檢視使用者空間動態庫、標頭檔案:
ls /usr/lib 動態庫檔案.so
ls /usr/local/lib
ls /usr/include
ls /usr/local/include

連結外部庫:
gcc -Wall a.c -o a.exe -lm 連結libm.so或者libm.a

檢視程式連結的庫:
ldd a.exe

把命令變成指令碼:
複製gcc -Wall a.c -o a.exe -lm 到mygcc檔案

修改檔案許可權:
chmod u+x mygcc
chmod 775 mygcc

靜態庫生成:

  1. touch myadd.h myadd.c
  2. vi myadd.c
    #include<stdio,h>
    #include<string.h>
    #include<stdlib.h>
    #include “myadd.h”
    int myadd(int a,int b)
    {
    int c=0;c=a+b;return c;
    }
  3. vi myadd.h
    extern int myadd(int a,int b);
  4. vi mygcca
    gcc -c myadd.c -o myadd.o
    ar rcs libmyadd.a myadd.o #ar是歸檔工具,rcs打包
    chmod 775 mygcca
  5. ./mygcca 生成libmyadd.a檔案

檢視檔案的屬性:
file libmyadd.a

檢視檔案的函式描述:
nm libmyadd.a

呼叫靜態庫:

  1. vi main.c
    #include<stdio,h>
    #include<string.h>
    #include<stdlib.h>
    #include “myadd.h”
    int main(void)
    {
    printf(“myadd:%d\n”,myadd(3,4));
    return 0;
    }
  2. gcc -L. main.c -o main.exe -lmyadd #-L指定靜態庫目錄
  3. ./main.exe

把命令變成指令碼:
複製gcc -L. main.c -o main.exe -lmyadd到mygcctest檔案
chmod 775 mygcctest

遞迴複製資料夾:
cp day02 day03 -r

移動所有標頭檔案到inc,所有原始檔到src
mv *.h ./inc
mv *.h ./src

gcc常用編譯選項:
-o 產生可執行檔案
-c 編譯原始碼
-E 預編譯
-S 產生彙編
-Wall 發出警告
-ldir dir加入標頭檔案搜尋路徑
-Ldir dir加入庫搜尋路徑
-llib 連結lib庫
-g 嵌入除錯資訊

從目錄編譯靜態庫:
vi mygcca
gcc -c -I./inc ./src/myadd.c -o myadd.o
ar rcs libmyadd.a myadd.o

從目錄呼叫靜態庫:

  1. ls test==> mygcctest main.c libmyadd.a
  2. vi mygcctest
    gcc -L. -I…/inc main.c -o main.exe
  3. tail mygcctest
    rm libmyadd.a #可執行程式生成之後就可以脫離靜態庫

動態庫生成:
vi mygccso
gcc -shared -fPIC -I./inc ./src/myadd.c -o libmyadd.so #-fPIC搜尋與路徑無關

檢視檔案的函式描述:
nm libmyadd.so | grep “myadd”

呼叫動態庫:

  1. vi mygcctest
    gcc -L. -I…/inc main.c -o main.exe -lmyadd
  2. ls libmyadd.so main.c mygcctest
  3. ./mygcctest

檢視程式連結的庫(動態庫和靜態庫):
ldd main.exe

檢視檔案屬性:
file main.exe

動態庫和靜態庫編譯的時候,可以把動態庫和靜態庫copy到gcc指令碼的目錄下
gcc能找到動態庫和靜態庫

動態庫配置路徑:

  1. 拷貝.so到系統共享庫目錄下/usr/lib
    cp libmyadd.so $HOME/lib
  2. vi .bash_profile
    新增:LD_LIBRARY_PATH=.:$HOME/lib:/usr/lib
    export LD_LIBRARY_PATH
  3. source .bash_profile

檢視環境變數:
env | grep LD*

終端用use+pwd登入伺服器,伺服器會為使用者執行一個shell
這個shell的配置檔案$(HOME)/.bash_profile
預設使用/bin/bash
檢視環境變數:
echo $PATH
echo $SHELL
檢視環境變數的設定:
env

修改shell執行的配置檔案,我們需要重新執行配置檔案
source .bash_profile
任何目錄下執行cd命令 都會轉到$HOME

socket專案編譯動態庫:
ls mysocket_so_test
bin etc inc lib log makefile mysocketexe src test

ls inc
itcast_comm.h itcastlog.h socketclientadd.h

ls src
demo01_tesplatfrom.c ticastlog.c socketclient.c

vi makefile
WORKDIR=.

VPATH = ./src

LIBOBJS= socketclient.o itcastlog.o

OBJS= demo01_testplatform.o

LIB1 = libmysocket.so

EXE1 = mysocketexe

CC = gcc

CFLGS= -Wall -g -I$(WORKDIR)/inc/

LIBFLAG = -L$(HOME)/lib

all: $(LIB1) $(EXE1)

( L I B 1 ) : (LIB1): (LIBOBJS)

$(CC) -shared -fPIC $^ -o [email protected]

cp  $(LIB1) $(HOME)/lib

mv  $(LIB1) ./lib

( E X E 1 ) : (EXE1): (OBJS)

$(CC)  $^ $(LIBFLAG) -lmysocket  -o [email protected]

.c.o:

$(CC) $(CFLGS) -c $< -o [email protected]  -shared -fPIC

clean:

rm -rf $(BIN) *.o $(HOME)/lib/$(LIB1) ./$(LIB1) 

檢視程式的記憶體大小:
size mysocketexe

檢視程式的函式描述:
strings mysocketexe

gdb除錯選項:
r 執行
l 列出原始碼
b 設定斷點
ib 檢視斷點資訊
c 繼續執行至下一個斷點
watch 設定觀察點
s 單步跟蹤,進入函式
n 單步跟蹤,不進入函式
finish 執行函式,直到返回
u 退出迴圈

除錯程式:
gdb mysocketexe

b main
b 20
info break
run
n
s
print handle #型別 地址
finish
quit

查詢除錯檔案core
ls -lt | grep “core”

設定檔案大小限制:
ulimit -c 3000

開啟除錯資訊:
gdb dem01 core.13973

工程專案方法,組織src和inc編譯動態庫和靜態庫:
1.c 2.c 3.c ====>src
1.h 2.h 3.h >inc
libsocket.so
>lib