在實際的開發中,C語言代碼除了符合最基本的語法規范之外還必須符合設計者的邏輯意圖,如果發現生成的可執行文件運行結果不正確,則可以通過相應的調試環境來跟蹤調試,因此需要用到gdb
監視程序中變量的值
設置斷點以使程序在指定的代碼上停止執行
一行行的執行代碼
[code]gdb <可執行文件名>
2.一旦調試的程序出現錯誤,會在當前目錄下產生核心內存映像core文件,可以在調用時指定一個core文件
[code]gdb <可執行文件名> core3.制定進程號的執行方式
[code]gdb <可執行的文件名> <進程號>3.應用實例
[code]lancao@lancao:~/AndroidGreammer/WorkSpace/C++/day_02$ gcc hello.c //編譯C語言源程序 lancao@lancao:~/AndroidGreammer/WorkSpace/C++/day_02$ ls a.out hello.c //a.out為編譯生成的可執行文件 lancao@lancao:~/AndroidGreammer/WorkSpace/C++/day_02$ gdb a.out //開始調試程序 ----------- (gdb) b main //在主函數處設置斷點 Breakpoint 1 at 0x40050a (gdb) run //開始執行程序 Starting program: /home/lancao/AndroidGreammer/WorkSpace/C++/day_02/a.out Breakpoint 1, 0x000000000040050a in main () (gdb) n //執行下一行 Single stepping until exit from function main, which has no line number information. __libc_start_main (main=0x400506 <main>, argc=1, argv=0x7fffffffe1d8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe1c8) at libc-start.c:321 321 libc-start.c: No such file or directory. //此行程序無輸出 (gdb) n //繼續執行下一行 Hello World[Inferior 1 (process 6094) exited normally] //輸出Hello World (gdb) quit //推出gdb $
[code]//hello.c的代碼 #include<stdio.h> #include"hello.h" int main(void){ printf("Hello World"); }2).新建一個hello.h
[code]//這裡不做任何操作 void m();3).編譯makefile文件
[code]#這裡寫注釋 #命令行前面必須加table空格 hello:hello.c hello.h gcc -o hello hello.c hello.h4.接下來進行管理
[code]lancao@lancao:~$ make //直接輸入make命令,會根據makefile文件信息進行執行文件 gcc -o hello hello.c hello.h //系統執行的語句 lancao@lancao:~$ ls hello hello.c hello.h makefile //目標文件生成
[code] CC = gcc CFLAGS = -g -Wall//多文件批處理 Hello:hello hello2 hello3 $(CC)$(CFLAGS) hello2 hello3 -o myprog hello:hello.c hello.h $(CC)$(CFLAGS) hello.c hello.h -o hello hello2:hello2.c $(CC)$(CFLAGS) hello2.c -o hello2 hello3:hello3.c hello3.h $(CC)$(CFLAGS) hello3.c hello3.h -o hello3
[code]DIR_INC = ./include DIR_SRC = ./src DIR_OBJ = ./obj DIR_BIN = ./bin SRC = $(wildcard ${DIR_SRC}/*.c) OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC})) TARGET = main BIN_TARGET = ${DIR_BIN}/${TARGET} CC = gcc CFLAGS = -g -Wall -I${DIR_INC} ${BIN_TARGET}:${OBJ} $(CC) $(OBJ) -o $@ ${DIR_OBJ}/%.o:${DIR_SRC}/%.c $(CC) $(CFLAGS) -c $< -o $@ .PHONY:clean clean: find ${DIR_OBJ} -name *.o -exec rm -rf {}
(1)Makefile中的 符號的意思:
[code] $@ 表示目標文件 $^ 表示所有的依賴文件 $< 表示第一個依賴文件 $? 表示比目標還要新的依賴文件列表(2)wildcard、notdir、patsubst的意思:
[code] wildcard : 擴展通配符 notdir : 去除路徑 patsubst :替換通配符