重新整理 .net core 實踐篇 —linux上排查問題實用工具 [外篇]

前言

介紹下面幾個工具:

Lldb
createdump
dotnet-dump
dotnet-gcdump
dotnet-symbol
Procdump

該文的前置篇為:

https://www.cnblogs.com/aoximin/p/16839812.html

獻給初學者,這篇就只介紹下看下日志和lldb,畢竟東西太多了。

正文

我以官網的例子作為演示:https://buggyambfiles.blob.core.windows.net/bin/buggyamb_v1.1.zip

項目地址:https://github.com/ahmetmithat/buggyamb

我這里就已經發布可以訪問了,并且用戶nginx 作為轉發,已經啟動起來了。

步驟在前面兩篇,如果看需要發布的,可以往前面兩篇看看,這里就不多復述了。

[Unit]
Description=BuggyAmb[Service]
WorkingDirectory=/var/buggyamb
ExecStart=/usr/bin/dotnet /var/buggyamb/BuggyAmb.dll
Restart=aways
RestartSec=10
SyslogIdentifier=BuggyAmb
User=root
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
Environment=ASPNETCORE_URLS=http://0.0.0.0:6000
[Install]
WantedBy=multi-user.target

service 的配置如上。

頁面測試如下:

33edde1fefa0b1928aa1cbdf7df99c59.png

里面分別是:

慢、處理異常、不處理異常、崩潰、未找到頁面、批處理

崩潰情況

這種比較好排查的,其實一般看日志就行。

我這里點一下Crash2,讓程序崩潰。這里說明一下,上面我用的是官方例子,直接可以看代碼怎么崩潰的哈。

public class Crash2Model : PageModel
{public string quote;~Crash2Model(){if (quote.ToString() != string.Empty){quote = null;}}public void OnGet(){}
}

這個可以看下。

那么我們進行日志排查一下錯誤。

journalctl -r --identifier=BuggyAmb --since "10 minute ago"

90db3f6dbb2b342d9cd1bcb9a0864938.png

af7bc97b0536d70b6d85e39bd3ae9ba8.png

告訴我們15行錯誤。

-r:按反向順序打印日志,以便首先列出最新日志。
--identifier:請記住 SyslogIdentifier=buggyamb-identifier 測試應用程序的服務文件中的行。(可以使用此方法強制日志僅顯示適用于有問題的應用程序的條目。)
--since:顯示在指定的上一時期記錄的信息。示例:--since "10 minute ago" 或 --since "2 hour ago".

journalctl 還有很多其他的功能,這里就不一一舉例了。

核心轉儲

centos 默認不開啟的:

可以看下這個怎么開啟的:

https://blog.csdn.net/ProgramVAE/article/details/105921381

#!/bin/bash#me: coredumpshell.sh
### Description: enable coredump and format the name of core file on centos system# enable coredump whith unlimited file-size for all users
echo -e "\n# enable coredump whith unlimited file-size for all users\n* soft core unlimited" >> /etc/security/limits.conf# set the path of core file with permission 777 
cd /var/buggyamb && mkdir corefile && chmod 777 corefile# format the name of core file.   
# %% – 符號%
# %p – 進程號
# %u – 進程用戶id
# %g – 進程用戶組id
# %s – 生成core文件時收到的信號
# %t – 生成core文件的時間戳(seconds since 0:00h, 1 Jan 1970)
# %h – 主機名
# %e – 程序文件名
echo -e "/var/buggyamb/corefile/core-%e-%s-%u-%g-%p-%t" > /proc/sys/kernel/core_pattern# for centos7 system(update 2017.2.3 21:44)
echo -e "/var/buggyamb/corefile/core-%e-%s-%u-%g-%p-%t" > /etc/sysctl.conf# suffix of the core file name
echo -e "1" > /proc/sys/kernel/core_uses_pid

運行之后就開啟了。

centos 一般用不上,我也沒有去調試過,這里就不演示了,只能說有這種東西。

使用lldb

安裝:yum install lldb

前文提及到這個要安裝lldb 3.9 以上的。

按照這個文檔來編譯安裝也行:

https://github.com/dotnet/diagnostics/blob/main/documentation/lldb/linux-instructions.md

在 lldb 中打開核心轉儲文件之前,請按照以下必需步驟設置符號路徑,下載符號,并在打開 lldb 時自動加載 SOS :

安裝 dotnet 符號工具:

dotnet tool install -g dotnet-symbol

下載目標轉儲文件的符號:

dotnet-symbol <path_of_dump_file>

安裝 SOS:

安裝 dotnet-sos 全局工具:

dotnet tool install -g dotnet-sos

安裝 SOS:

dotnet-sos install

最后成功的樣子:

f2c75f0afd4cd604ff1ddab7364a2692.png

使用createdump:

Createdump 會與每個 .NET Core 運行時一起自動安裝。

如 創建的ump 配置策略 文檔中所述,可以設置具有環境變量的配置選項。這些將作為參數傳遞給創建的ump 命令。下面是支持的環境變量:

COMPlus_DbgEnableMiniDump:如果設置為 1,則在終止時啟用自動核心轉儲生成。默認值為 0 。
COMPlus_DbgMiniDumpType:這是將要創建的微型轉儲文件的類型。此值的默認值為 2 (或枚舉類型 MiniDumpWithPrivateReadWriteMemory) 。這意味著生成的轉儲文件將包括 GC 堆以及捕獲進程中所有現有線程的堆棧跟蹤所需的信息。
COMPlus_DbgMiniDumpName:如果設置,請用作模板來創建轉儲文件路徑和文件名。可以使用參數將 PID 放入名稱中 %d 。默認模板為 /tmp/coredump.%d. 通過使用此環境變量,可以配置輸出目錄。
COMPlus_CreateDumpDiagnostics:如果設置為 1,則啟用創建的ump 工具診斷消息 (TRACE 宏) 。如果 createdump 不能按預期工作并且不生成內存轉儲文件,則此設置可能很有用。

詳細信息如下:https://github.com/dotnet/coreclr/blob/master/Documentation/botr/xplat-minidump-generation.md#configurationpolicy

進行開啟:

2e4e585cc1f0d3f829e7882f216dc4ec.png

然后重啟,再來點擊clash3進行崩潰一下。

73a4c4d29beb422432fc79044ad9a2c5.png

可以看到這里就有了。

這里我們先轉儲文件符號一下:

dotnet-symbol /tmp/coredump.9784-o /dumps/symbols/ --host-only

然后進去一下:

lldb --core /tmp/coredump.9784

這個時候要加載一下dotnet 符號。

setsymbolserver -directory /dumps/symbols/

然后加載轉儲文件符號:

loadsymbols

這樣就搞定了。

clrsthread 查看一下線程的情況:

d902956dfc56b574ada79fc532d1d1bc.png

這里可以看到里面有個異常是15號線程。

切到15號線程:

setthread 15:

717053a9a9a25c3c8ce14b60fada937e.png

然后查看一下clrstack(調用棧信息):

585f58606648a6772e1fd1d5ff901239.png

這個似乎沒有告訴我們很多很有用的信息,只能告訴我們線程異常了,當然也告訴我們具體的行,可以去看下去源代碼看下什么類型異常,但是有跟好用的pe。

用pe查看下:

pe  -- Displays and formats fields of any object derived from the Exception class at the specified address.

17db04f536d98da7e84067065dac2f56.png

這樣就定位到具體的崩潰文件了。

知道了崩潰是因為HttpWebRequest,希望的是能查到到底是哪個訪問url造成了崩潰。

下面這個圖,證明可調用了HttpWebRequest引發的:

4d8ac47df422b3e47e53355027e3f514.png

使用dumpheap:dumpheap -stat -type System.Net.HttpWebRequest 查看httpwebrequest 調用棧:

39b11fc1b61eb97bd71b1273d59e0711.png

查看棧地址:

c85d708bfb1953d3684d59bfe21a14b3.png

然后是根據地址查看對象:dumpobj 00007fe0c4442f28

ae67f66294436544e495bb85c4636319.png

這個webrequest 里面有一個是system.url 我們寫程序的知道這是訪問地址。

然后繼續查這個對象,上面那個value 就是地址哈。

00007fe0c4437cf8

然后可以看到url 地址:

c7839eed06e4e7fb0828f94d700c5e94.png

第一個就是了,為什么確認第一個就是,看名字。

73907f79afbb42c746f4638e5051e4e7.png

這樣就查到了。

先到這里吧,介紹這個lldb 是為了查看非托管棧的,如果查看托管的一般使用dotnet-dump 就好了。

而且一般是用來分析cpu 和 內存高的地方,一般服務端錯誤會有日志的。

繼續后面演示cpu 和 內存高的例子,這個對服務端更有實用性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281347.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281347.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281347.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Office 365離線安裝

Office 365除了可以在線安裝外&#xff0c;還可以進行離線安裝&#xff0c;但激活還是需要連接互聯網的喲首先下載Office部署工具https://www.microsoft.com/en-us/download/details.aspx?id49117 下載文件后&#xff0c;運行自解壓縮可執行文件&#xff0c;其中包含 Office 部…

reduceByKey和groupByKey區別與用法

2019獨角獸企業重金招聘Python工程師標準>>> 在Spar看中&#xff0c;我們知道一切的操作都是基于RDD的。在使用中&#xff0c;RDD有一種非常特殊也是非常實用的format——pair RDD&#xff0c;即RDD的每一行是&#xff08;key, value&#xff09;的格式。這種格式很…

python自動化測試-D6-學習筆記之一(常用模塊補充datetime模塊)

# datetime 模塊import datetimeprint(datetime.datetime.today()) #當前日期&#xff0c;到秒 打印結果&#xff1a;2018-01-21 10:23:46.034410print(datetime.datetime.now()) # 當前日期&#xff0c;到秒 打印結果&#xff1a;2018-01-21 10:23:46.034410print(datetime.d…

Vue如何在data中正確引入圖片路徑

方法一&#xff1a;將圖片資源放入項目 /static 目錄下&#xff0c;使用絕對或相對路徑引用即可 // 文件結構 |-- src | |-- components | | |-- banner.vue |-- static | |-- images | | |-- pic.jpg<template><div id"banner"><img :s…

軟件工程的第一性原理丨SmartIDE

作者&#xff1a;徐磊原文地址&#xff1a;https://smartide.cn/zh/blog/2022-1022-software-engineering/徐磊英捷創軟科技&#xff08;北京&#xff09;有限公司創始?/?席架構師 / CEO / SmartIDE開源項?創始?。微軟最有價值專家MVP&#xff0c;微軟區域技術總監&#xf…

排序算法之快速排序詳解

一、算法介紹 快速排序&#xff1a;快速排序的基本思想是通過一次排序將等待的記錄分成兩個獨立的部分&#xff0c;其中一部分記錄的關鍵字小于另一部分的關鍵字。C部分的快速排序一直持續到整個序列被排序。 任取一個元素 (如第一個) 為中心提出所有小于它的元素&#xff0c;并…

openstack 中國聯盟公開課參會總結

主流趨勢 1. openstack defcore 互操作性認證。打通不同的openstack 廠商之間的連接2. 首批OpenStack管理員認證(COA)將于2016年進行3. 混合云應用廣泛 Cloud Broker,cascading openstack 云連接器4. DevOps5. 虛擬桌面6. Storage 方面&#xff0c;Ceph和Glusterfs 7. Network…

bzoj1088[SCOI2005]掃雷Mine

1088: [SCOI2005]掃雷Mine Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4284 Solved: 2552[Submit][Status][Discuss]Description 相信大家都玩過掃雷的游戲。那是在一個n*m的矩陣里面有一些雷&#xff0c;要你根據一些信息找出雷來。萬圣節到了&#xff0c;“余”人國流…

Re:從零開始的Vue項目搭建

Re&#xff1a;從零開始的Vue項目搭建初始的終結與結束的開始Nodejs項目的簡單測試從零開始webpack開發模式webpack編譯打包后記初始的終結與結束的開始 最開始接觸vue項目搭建是從vue-cli開始&#xff0c;模板式操作&#xff0c;一鍵搞定&#xff0c;幾乎可以無縫進入代碼開發…

在數據庫插入帶小數點數據的問題

想在mysql插入以下數據設計表的時候沒有注意,之前都用的int,這次換成了double,但是插入第一條3.50的時候數據庫顯示為:查了之后知道是設計表的時候沒有注意小數點的設置轉載于:https://juejin.im/post/5c0f61bb6fb9a049ea38cbe9

oracle 11g 創建 job 20

15-10-19 23:48:04分類&#xff1a; Oracle--創建一次執行的匿名塊任務&#xff0c;成功調用一次后job消失BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name > my_new_job2, job_type > PLSQL_BLOCK, job_action &g…

Jzoj5317 Func

f(1)1 f(2x)f(x) f(2x1)f(x)f(x1) 給出n<10^6&#xff0c;求:所有的i滿足f(i)n 第一道類歐算法 我們考慮一個性質 f(2x1)f(x)f(x1)f(2x)f(2x2) 所以&#xff0c;顯然有f(2x1)>f(2x) f(2x1)>f(2x2) 那么現在我們知道了f(2x1),自然考慮枚舉一個f(2x) 可以按照以下形式…

C# WPF 用代碼畫一幅圖(*精品*)

概述有時候我們的程序界面中需要顯示一些簡單的示意圖&#xff0c;一般我們有原圖的話直接嵌入我們程序就可以&#xff0c;但有時候我們沒有原圖&#xff0c;這時候我們不妨用代碼自己畫出來.今天小編要給大家展示的是這樣一副圖片&#xff1a;接下來&#xff0c;我就用代碼純手…

礦難讓顯卡壓了那么多貨咋辦?NV如是說

2019獨角獸企業重金招聘Python工程師標準>>> 在蘇州 GTC 開幕的幾天前&#xff0c;英偉達剛剛遭遇了一次股價的腰斬。 近來加密貨幣的熱度漸低&#xff0c;受到挖礦熱潮照顧許多的英偉達「礦機」銷量受到打擊&#xff0c;甚至出現了嚴重的庫存危機&#xff0c;加上近…

花式看超級碗 人工智能、大數據在碗里

“超級碗”可不是一個大碗!!!超級碗(Super Bowl)是美國國家美式足球聯盟(也稱為國家橄欖球聯盟)的年度冠軍賽&#xff0c;勝者被稱為“世界冠軍”。超級碗一般在每年1月最后一個或2月第一個星期天舉行&#xff0c;那一天稱為超級碗星期天(Super Bowl Sunday)。超級碗是比賽的名…

Git分支操作與遠程倉庫的使用

Git分支操作本地倉庫創建分支合并分支刪除分支遠程倉庫push 推送遠程分支pull 拉取遠程分支fetch 更新遠程分支本地分支與遠程分支的跟蹤關系本地倉庫 由于Git的分布式特性&#xff0c;所以沒有絕對的本地和遠程概念&#xff0c;一切都是相對的。對于分支的操作&#xff0c;個…

SimMechanics/Second Generation倒立擺模型建立及初步仿真學習

筆者最近搗鼓Simulink&#xff0c;發現MATLAB的仿真模塊真的十分強大&#xff0c;以前只是在命令窗口敲點代碼&#xff0c;直到不小心敲入simulink&#xff0c;就一發不可收拾。話說simulink的模塊化建模確實方便&#xff0c;只要拖拽框框然后雙擊設置屬性就可以慢慢堆建自己的…

10 行代碼提取復雜 Excel 數據

把 Excel 文件導入關系數據庫是數據分析業務中經常要做的事情&#xff0c;但許多 Excel 文件的格式并不規整&#xff0c;需要事先將其中的數據結構化后再用 SQL 語句寫入數據庫。而一般情況下&#xff0c;結構化的工作量會比較大&#xff0c;而且很難通用&#xff0c;每次都要針…

將一個數組拆分為若干個相等數組

var a [法國,澳大利亞,智利,新西蘭,西班牙,加拿大,阿根廷,美國,0,國產,波多黎各,英國,比利時,德國,意大利,意大利]; var b []; var result []; var k 0; for(var i 0; i<a.length; i){ if(i%3 0){ b []; for(var j 0; j<3; j){ if(a[ij] undefined){ continue; …

人工智能模型的網絡結構可視化

本文主要介紹人工智能模型的網絡結構可視化的常見方法。對于使用神經網絡模型來說&#xff0c;我們主要關注的是模型的輸入和輸出。在 ML.NET 中使用 ONNX 模型時&#xff0c;我們就需要了解這些信息&#xff0c;以便在構成神經網絡的所有層之間生成連接映射。下圖就是昨天 《Y…