gdb單步除錯c應用程式

2021-10-01 18:58:31 字數 3113 閱讀 9795

0--報錯資訊

[2019-12-28 14:59:34:023][    kms_server.c][0178]: get the sign [sigse**]!

[2019-12-28 14:59:34:023][    kms_server.c][0180]: kms exit by signal [11]!

1--檢視程序號

[imipay@ips-vm-posp-30-55 bin]$ ps -ef | grep kms_server

imipay    36156  36000  0 16:24 ?        00:00:00 kms_server 3001 1

imipay    36166  36094  0 16:28 pts/4    00:00:00 grep kms_server

gdb kms_server 36156

3--設定斷點

(gdb) break kms_process

breakpoint 1 at 0x40d87b: file kms_server.c, line 221.

(gdb) break kms_issue_tmk

breakpoint 2 at 0x419099: file kms_server.c, line 3227.

4--finish -- 執行程式,直到當前函式完成返回。並列印函式返回時的堆疊位址和返回值及引數值等資訊

(gdb) finish

run till exit from #0  0x00007eff3250b7f0 in __accept_nocancel () from /lib64/libc.so.6

5--執行呼叫

外部程式呼叫列印:

0x000000000040d227 in main (argc=3, ar**=0x7ffd68e756f8) at kms_server.c:103

103            if((nsocketid1=accept(sockfd,(struct sockaddr *)&cli_addr,&size))==-1){

6--在gdb中,和除錯步進相關的命令主要有如下幾條:

continue    繼續執行程式直到下乙個斷點(類似於vs裡的f5),簡寫c

next        逐過程步進,不會進入子函式(類似vs裡的f10),簡寫n

setp        逐語句步進,會進入子函式(類似vs裡的f11),簡寫s

until        執行至當前語句塊結束,簡寫u

finish      執行至函式結束並跳出,並列印函式的返回值(類似vs的shift+f11),簡寫f

break     打斷點,簡寫b,用法:b ***.c:***行 / b ***行

print       列印變數,簡寫p,用法:p 變數名

list         列出程式的源**,預設每次顯示10行,簡寫l

(gdb) continue

continuing.

[new process 36212]

[thread debugging using libthread_db enabled]

[switching to thread 0x7fc2db163700 (lwp 36212)]

breakpoint 1, kms_process (client_info=0x7ffc60782b00) at kms_server.c:221

221        struct cli_info *info=client_info;

參考資料:

**********後面是自己看的**********

1、關於memset初始化變數

對於字元陣列可以用兩種方式

memset(temp, 0x00, sizeof(temp));

memset(&temp, 0x00, sizeof(temp));

對於結構體變數,建議強制轉換為(char *)

memset((char *)&tsendipcinttxn, 0x00, sizeof(tsendipcinttxn));
2、編譯pc檔案時不刪除.c

mkstand.mak修改

將「@$(rm) $*.lis $*.c」,改為「@$(rm) $*.lis」

.pc.o:

$(echo) "compiling [$@] ..."

@$(pc) lines=yes define=$(dbd) include=$(tuxincp) include=$(incp) include=$(jincp) include=$(rhgccincp) include=$(jmdincp) include=`dirname $@` code=ansi_c iname=$*$(dbfix) dynamic=ansi

@$(cd) `dirname $@` ; \

$(cc) -o $@ `cat $(fehome)/online/mak/.mak.tmp` $(cc***s) -c $*.c

@$(rm) $*.lis

3、gcc編譯開啟警告資訊

mkstand.mak修改

在cc***s最後加上-wall -wextra

cc***s  =       $(rl***) $(cc***) $(defs) $(tuxdef) $(dbdef) $(osdef) $(procdef) $(bitdef) $(incps) -wall -wextra
4、普通編譯和交叉編譯(以編譯libiconv為例)

普通編譯:./configure --prefix=/usr/local

交叉編譯:./configure --prefix=/usr/local --host=x86_64

普通編譯生成:libcharset.a  libcharset.la  libcharset.so  libcharset.so.1  libcharset.so.1.0.0  libiconv.la  libiconv.so  libiconv.so.2  libiconv.so.2.6.1

交叉編譯生成:libcharset.a  libcharset.la  libiconv.a  libiconv.la

交叉編譯不生成so動態鏈結庫

Emacs Lisp程式單步除錯

原址 emacs執行過程中有時候會報錯,這時我們需要對其進行debug 除錯 執行m x toggle debug on error開啟debug開關,這樣當emacs出錯的時候會進入debug模式。例如,我們有以下程式,這裡xyz是個未定義的函式 defun aborn debug demo de...

單步除錯 番外篇 使用gdb對程式進行除錯

在微控制器開發中,如keil或者iar,我們可以直接插上我們的jlink,很輕鬆的在開發環境上設定斷點,單步執行,檢視變數等除錯動作,所以就有好多從微控制器轉到linux上的使用者感覺很不習慣,上篇的番外對makefile的介紹也是由於這個原因,因為我們在整合開發環境中點一下編譯就可以了。完全把我們...

使用gdb除錯應用程式

toc gdb是乙個由gnu開源組織發布的 unix linux作業系統下的 基於命令列的 功能強大的程式除錯工具。對於一名linux下工作的c 程式設計師,gdb是必不可少的工具 對於c c 程式,編譯的時候需要加上 g引數生成除錯資訊。如 gcc g hello.c o hello 啟動gdb後...