日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx下使用asan和valgrind两个静态检查工具

發(fā)布時間:2024/1/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nginx下使用asan和valgrind两个静态检查工具 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、valgrind

valgrind安裝:參考:?https://blog.csdn.net/justheretobe/article/details/52986461

wegit:http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2

tar -jxvf valgrind-3.12.0.tar.bz2

?cd valgrind-3.12.0

?./configure

?make

sudo make install

輸入valgrind–h顯示valgrind的參數(shù)及提示,說明安裝成功

luajit問題:參考https://groups.google.com/forum/#!topic/openresty/riEO_YXTwz4

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

sudo valgrind --tool=memcheck --leak-check=full /usr/local/nginx-1.4.2/sbin/nginx

==41400== Memcheck, a memory error detector

==41400== Copyright (C) 2002-2013, and GNU GPL'd,?by?Julian Seward et al.

==41400== Using Valgrind-3.10.0 and LibVEX; rerun with -h?for?copyright info

==41400== Command: /usr/local/nginx-1.4.2/sbin/nginx

==41400==

==41400== Warning:?set?address range perms: large range [0x957a040, 0x2e45f7e2) (undefined)

==41400== Warning:?set?address range perms: large range [0x957b040, 0x2e45f040) (defined)

nginx: [error] failed to initialize Lua VM?in?/usr/local/nginx-1.4.2/conf/nginx.conf:125

==41400==

==41400== HEAP SUMMARY:

==41400==?????in?use at exit: 619,703,912 bytes?in?3,285 blocks

==41400==?? total heap usage: 20,476 allocs, 17,191 frees, 626,783,730 bytes allocated

==41400==

==41400== 128 bytes?in?1 blocks are possibly lost?in?loss record 583 of 650

==41400==??? at 0x4C2ABA0: malloc (in?/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==41400==????by?0x431D0A: ngx_alloc (ngx_alloc.c:22)

==41400==????by?0x4222CE: ngx_crc32_table_init (ngx_crc32.c:117)

==41400==????by?0x41A20B: main (nginx.c:320)

==41400==

==41400== 1,024 bytes?in?1 blocks are definitely lost?in?loss record 626 of 650

==41400==??? at 0x4C2D136: memalign (in?/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==41400==????by?0x4C2D251: posix_memalign (in?/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==41400==????by?0x431DBB: ngx_memalign (ngx_alloc.c:57)

==41400==????by?0x41B5C2: ngx_create_pool (ngx_palloc.c:21)

==41400==????by?0x419F52: main (nginx.c:299)

==41400==

==41400== LEAK SUMMARY:

==41400==??? definitely lost: 1,024 bytes?in?1 blocks

==41400==??? indirectly lost: 0 bytes?in?0 blocks

==41400==????? possibly lost: 128 bytes?in?1 blocks

==41400==??? still reachable: 619,702,760 bytes?in?3,283 blocks

==41400==???????? suppressed: 0 bytes?in?0 blocks

==41400== Reachable blocks (those to which a pointer was found) are not shown.

==41400== To see them, rerun with: --leak-check=full --show-leak-kinds=all

==41400==

==41400== For counts of detected and suppressed errors, rerun with: -v

==41400== ERROR SUMMARY: 2 errors?from?2 contexts (suppressed: 0?from?0)

解決的辦法是使用 openresty 的 luajit 倉庫的 v2.1-agentzh 分支重新:??https://github.com/openresty/luajit2/tree/v2.1-agentzh?,然后,重新編譯一個特殊版本的 LuaJIT,強制它使用系統(tǒng)的分配器,即在編譯 LuaJIT 時使用類似下面的命令:?make CCDEBUG=-g Q= XCFLAGS='-DLUAJIT_USE_VALGRIND -DLUAJIT_USE_SYSMALLOC'?

?

編譯腳本做下面的修改:

export?LUAJIT_INC=/usr/local/include/luajit-2.1

?

nginx處理請求都是在worker進程中,如果不特殊配置valgrind只檢測master進程的信息,可以配置下面的樣子,設(shè)置worker進程啟動:

worker_processes 1;
daemon off;
master_process off;

或者使用在valgrind中使用–trace-children=yes?選項跟蹤子進程信息

啟動方式

sudo?valgrind?--tool=memcheck?./sbin/nginx??-p?.?-c?conf/配置文件.conf

或以日志形式記錄

sudo valgrind?--log-file=./valgrind_report.log?--leak-check=full?--show-leak-kinds=all?--show-reachable=no?--track-origins=yes --trace-children=yes?./sbin/nginx?-p?.?-c?conf/main.conf

?

2、asan

(1)適配代碼:

編譯腳本中添加:

--fsanitize=address -fno-omit-frame-pointer -static-libasan
--with-ld-opt="-fsanitize=address -static-libasan"

makefile中添加 :-fsanitize=address -fno-omit-frame-pointer -static-libasan

nginx本身需要適配一些文件,不然,會誤認(rèn)為是內(nèi)存泄漏。

修改下面的文件:

?modified:???libs/libwtf/GNUmakefile
?modified:???libs/protobuf/Makefile
?modified:???src/core/nginx.h
?modified:???src/core/ngx_array.c
?modified:???src/core/ngx_array.h
?modified:???src/core/ngx_palloc.c
?modified:???src/core/ngx_palloc.h

(2)安裝clang

(3)編譯新版本運行起來,然后查看日志

默認(rèn)情況下,asan遇到內(nèi)存問題,就會終止當(dāng)前進程的執(zhí)行,并在spanner的日志文件error.log中打印相關(guān)的問題,以及問題的調(diào)用棧信息。

線上生成的調(diào)用棧只有函數(shù)地址,沒有符號信息,可以將生成的調(diào)用棧弄下來

總結(jié)

以上是生活随笔為你收集整理的nginx下使用asan和valgrind两个静态检查工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。