輸出nginx執行過程中函式呼叫關係

2021-08-18 15:07:26 字數 4290 閱讀 3424

首先在src/core/目錄下新增兩個檔案,分別是my_debug.h和my_debug.c。

#ifndef my_debug_lenky_h

#define my_debug_lenky_h

#include void enable_my_debug(void) __attribute__ ((no_instrument_function));

void disable_my_debug(void) __attribute__ ((no_instrument_function));

int get_my_debug_flag(void) __attribute__ ((no_instrument_function));

void set_my_debug_flag(int) __attribute__ ((no_instrument_function));

void main_constructor(void) __attribute__ ((no_instrument_function, constructor));

void main_destructor(void) __attribute__ ((no_instrument_function, destructor));

void __cyg_profile_func_enter(void*, void*) __attribute__ ((no_instrument_function));

void __cyg_profile_func_exit(void*, void*) __attribute__ ((no_instrument_function));

#ifndef my_debug_main

extern file *my_debug_fd;

#else

file *my_debug_fd;

#endif

#endif

#include "my_debug.h"

#define my_debug_file_path "/usr/local/nginx/sbin/mydebug.log"

int _flag = 0;

#define open_my_debug_file() \

(my_debug_fd = fopen(my_debug_file_path, "a"))

#define close_my_debug_file() \

do \

}while (0)

#define my_debug_print(args, fmt...) \

do \

if (null == my_debug_fd && null == open_my_debug_file()) \

fprintf(my_debug_fd, args, ##fmt); \

fflush(my_debug_fd); \

} while (0)

void enable_my_debug(void)

void disable_my_debug(void)

int get_my_debug_flag(void)

void set_my_debug_flag(int flag)

void main_constructor(void)

void main_destructor(void)

void __cyg_profile_func_enter(void *this, void *call)

void __cyg_profile_func_exit(void *this, void *call)

makefile有如下幾個地方需要修改(加粗部分): 

需要修改如下兩個地方: 

1. 在ngx_core.h中新增:

#include "my_debug.h"
在nginx.c中新增:

#define my_debug_main 1
在main函式新增     enable_my_debug();

執行程式:./objs/nginx,生成檔案/usr/local/nginx/sbin/mydebug.log,路徑是在my_debug.c中定義的。裡面顯示的只是函式的呼叫位址,可以寫乙個指令碼addr2line.sh將位址轉換為函式名。

#! /bin/sh

if [ $# != 3 ]; then

echo 'usage: addr2line.sh executefile addressfile functionfile'

exit

fi;cat $2 | while read line

do if [ "$line" = 'enter' ]; then

read line1

read line2

# echo $line >> $3

addr2line -e $1 -f $line1 -s >> $3

echo "--->" >> $3

addr2line -e $1 -f $line2 -s | sed 's/^/ /' >> $3

echo >> $3

elif [ "$line" = 'exit' ]; then

read line1

read line2

addr2line -e $1 -f $line2 -s | sed 's/^/ /' >> $3

echo "<---" >> $3

addr2line -e $1 -f $line1 -s >> $3

echo >> $3

fi;done

執行指令碼:

./addr2line.sh ./objs/nginx /usr/local/nginx/sbin/mydebug.log myfun.log
就可以在mydebug.log中看到從nginx啟動開始呼叫的各函式之間的關係。 

擷取一部分如下:

main

nginx.c:279

--->

ngx_regex_init

ngx_regex.c:74

ngx_regex_init

ngx_regex.c:74

<---

main

nginx.c:279

main

nginx.c:313

--->

ngx_os_init

ngx_posix_init.c:34

ngx_os_init

ngx_posix_init.c:38

--->

ngx_os_specific_init

ngx_linux_init.c:35

ngx_os_specific_init

ngx_linux_init.c:35

<---

ngx_os_init

ngx_posix_init.c:38

set ff
如果這樣執行會出現錯誤: 

/bin/sh^m: bad interpreter: no such file or directory 

解決辦法: 

在vi中執行命令

set ff = unix
在執行make命令時出現錯誤, 

no target 『\』 

解決辦法: 

在makefile檔案中『\』表示不換行,但是我在』\』後面多加了空格,只要把空格刪除就好了

php在執行過程中PHP中強制輸出內容

ob end clean 在迴圈輸出前,要關閉輸出緩衝區 print 一共5個檔案要處理 sleep 1 print str pad 5000 為什麼非要5000?呵呵,大於5000也可以 ob flush 禁止顯示錯誤,如果前面沒有緩衝內容,ob flush是會出錯的 flush 瀏覽器在接受輸出...

繼承過程中建構函式的執行順序

基類一定要寫預設建構函式 無引數的建構函式 因為無法預見派生類的物件是否呼叫預設建構函式。如果派生類物件呼叫預設建構函式,則構造基類物件時只能呼叫預設建構函式,如果不寫,將會出錯。建構函式和析構函式均不被繼承。建構函式的呼叫順序 1 基類建構函式,按照被繼承時宣告的順序 2 成員物件初始化,按照類中...

iis執行siteserver過程中遇到的問題

問題一 system.web.hosting.hostingenvironmentexception 訪問 iis 元資料庫失敗。解決辦法 1 開啟cmd,進入 c windows microsoft.net framework v2.0.50727 2 輸入 aspnet regiis.exe i...