首先在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...