後端開發核心技術 第5章除錯 strace

2021-10-06 01:32:50 字數 2511 閱讀 7692

所有作業系統在其核心都有一些內建的函式,這些函式可以用來完成一些系統級別的功能,這些函式被稱為系統呼叫,這些函式代表了使用者空間到核心空間的一種轉換

例如使用者空間呼叫open函式,在核心空間中則會呼叫sys_open。

系統呼叫並不直接返回錯誤碼,而是將錯誤碼放入到乙個名為errno的全域性變數中。

errno的值只在函式發生錯誤時設定。如果函式不發生錯誤,errno的值就無定義,並不會被置為0.另外,在處理errno錢最好將它的變數存入另乙個變數,因為在處理過程中,即使像printf()這樣的函式出錯時也會改變errno的值

strace命令是乙個集診斷、除錯、統計與一體的工具,我們可以使用strace對應用的系統呼叫和訊號傳遞的跟蹤結果來對應用進行分析,以達到解決問題或者是了解應用工作過程的目的。當然strace與專業的除錯工具比如說gdb之類的是沒法相比的,因為它不是乙個專業的偵錯程式。

strace .

/test

首先strace ./test

然後開啟另乙個視窗,輸入命令「killall test」

strace中的結果顯示test程序「+++ killed by sigterm +++」事實上,命令killall test就是殺死所有名為test的程序

strace -c test

[root@localhost five]# strace -c test

% time seconds usecs/call calls errors syscall

----

----

----

-------

----

-------

-------

----

-------

----

----

----

--0.00

0.000000

01 read

0.00

0.000000

03 open

0.00

0.000000

05 close

0.00

0.000000

03 fstat

0.00

0.000000

09 mmap

0.00

0.000000

03 mprotect

0.00

0.000000

01 munmap

0.00

0.000000

03 brk

0.00

0.00000001

1 access

0.00

0.000000

01 execve

0.00

0.000000

01 arch_prctl

----

----

----

-------

----

-------

-------

----

-------

----

----

----

--100.00

0.000000

311 total

會顯示呼叫多少次read函式,多少次write函式等

一 -o就是將strace的結果輸入到檔案中

strace -c -o test.txt .

/test

或者strace -c .

/test 2

>test2.txt

二、-t將每個系統呼叫時間所花費的時間列印出來

strace -t .

/test

三、-p。strace不光能自己初始化乙個程序strace,還能跟蹤現有的程序

strace -p pid
#include

#include

#include

using

namespace std;

intmain()

while

(!in.

eof())

return0;

}

g++

-o test test.cpp

./test

輸出error opening file

用strace進行除錯,strace ./test

找到問題,沒有input.txt

Java核心技術筆記 第5章

size large 1 動態繫結 size size medium 靜態繫結 private方法 static方法 final方法或者構造器 子類陣列的引用可以轉換成超類陣列的引用 在覆蓋方法時一定要保證返回型別的相容性,子類方法不能低於超類方法的可見性 在equals方法中,如果子類決定相等的概...

後端開發核心技術 第7章網路IO模型 poll

include intpoll struct pollfd fds,unsigned int nfds,int timeout 1 fds 指向乙個結構體陣列的第0個元素的指標,每個陣列元素都是乙個struct pollfd結構,用於指定測試某個給定的fd的條件 2 nfds 表示fds結構體陣列的...

後端開發核心技術 第4章編譯 靜態鏈結和動態連線

add.h ifndef add h define add h intadd int a,int b endif add.cpp include add.h intadd int a,int b sub.h ifndef sub h define sub h intsub int a,int b e...