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後...