2017-08-01 48 views
1

我正在閱讀Apache httpd源代碼,我想知道什麼時候發出請求,哪個函數首先被調用,然後是哪個函數,等等,是否有一些簡單的方法可以這樣做?如何打印c中函數的調用順序?

喜歡的東西

Waiting client connection... # a client send a HTTP request 
client.c:accept_request() is called 
client.c:handle_request() is called 
asdf.c:func1() is called 
fdsa.c:func2() is called 
response.c:send_response() is called 
Waiting client connection... 
+0

EHH?不是C代碼嗎? (你是這樣標記的),AFAIK,C是面向流程的... –

+0

請澄清一下:你想在運行時打印調用堆棧嗎?這在標準C中是不可能的。 –

+0

對於Linux,有['backtrace()'](http://man7.org/linux/man-pages/man3/backtrace.3.html)。有意義輸出的符號。 –

回答

1

將一個printf聲明在每個函數的開頭

printf("Called function: %s\n", __func__); 

這將打印功能的名稱時,該函數被調用,這樣,您就能夠知道函數調用序列。

+0

有這麼多的功能... – Sato

+0

這是唯一的難辦法。 – haccks

1

不是一個容易沒辦法,但也有多種可能性:

  • ,如果你可以運行代碼,然後通過它去與調試器或分析器可以幫助你看看是怎麼回事
  • 再次,如果你可以運行的代碼,你可以添加跟蹤瞭解的功能流
printf(">>> entering %s\n", __func__); 
printf("<<< leaving %s\n", __func__); 
  • 如果你不能運行代碼,那麼也許ctags這樣或cscope的工具可以幫助您查看哪些函數被調用時(或類似Eclipse或的IntelliJ一個IDE)