成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

記一次.NET某企業(yè)ERP網(wǎng)站系統(tǒng)崩潰分析

開(kāi)發(fā) 前端
這次事故是由于 satrda 層面找不到文件路徑導(dǎo)致的程序崩潰,據(jù)朋友說(shuō)在 C# 層面沒(méi)收到這種C++異常,確實(shí)當(dāng) C# 和 C++ 產(chǎn)生交互時(shí)經(jīng)常會(huì)有各種奇怪的問(wèn)題,我無(wú)意刪除你的,你無(wú)意干擾我的,大家都好自為之吧!

一:背景

1. 講故事

前段時(shí)間收到了一個(gè)朋友的求助,說(shuō)他的ERP網(wǎng)站系統(tǒng)會(huì)出現(xiàn)偶發(fā)性崩潰,找了好久也沒(méi)找到是什么原因,讓我?guī)兔聪?,其?shí)崩潰好說(shuō),用 procdump 自動(dòng)抓一個(gè)就好,拿到 dump 之后,接下來(lái)就是一頓分析了。

二:WinDbg 分析

1. 是什么導(dǎo)致的崩潰

windbg 有一個(gè)自動(dòng)化的分析命令 !analyze -v 可以幫我們提前預(yù)診一下,就好像進(jìn)醫(yī)院先在問(wèn)詢臺(tái)那里過(guò)一下。

0:019> !analyze -v
CONTEXT: (.ecxr)
eax=14c9cd00 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=14c9d664
eip=682a024a esp=14c9cfd4 ebp=14c9d018 iopl=0 nv up ei pl nz ac po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000212
msvcr90!fprintf+0x34:
682a024a 83c414 add esp,14h
Resetting default scope

EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 682a024a (msvcr90!fprintf+0x00000034)
ExceptionCode: c0000417
ExceptionFlags: 00000001
NumberParameters: 0

PROCESS_NAME: w3wp.exe

ERROR_CODE: (NTSTATUS) 0xc0000417 - C

EXCEPTION_CODE_STR: c0000417

STACK_TEXT:
14c9d018 1766013b 00000000 176d9c60 17def1a8 msvcr90!fprintf+0x34
WARNING: Stack unwind information not available. Following frames may be wrong.
14c9d664 454c5153 75636578 203a6574 5332347b satrda!Writer_Write+0x4bb
000000c8 75636578 203a6574 5332347b 207d3230 0x454c5153
000000c8 17673623 17d538e8 17ded730 00000001 crypt32!profapi_NULL_THUNK_DATA_DLA <PERF> (crypt32+0x126578)
00000009 176604b6 14c9d74c 17ded730 17dae9c8 satrda!SATRDA_Proto_UnitTest+0x6c93
ffffffff 17654012 17dae9c8 17d538e8 17ded730 satrda!Writer_Write+0x836
17dae9c8 665fe072 14c9d74c 00000001 1765405b satrda!ConfigDSN+0xd0c2
...
160a0000 00000000 00000000 00000000 00000000 0x7071e31

FAULTING_SOURCE_LINE: f:\dd\vctools\crt_bld\self_x86\crt\src\fprintf.c

FAULTING_SOURCE_FILE: f:\dd\vctools\crt_bld\self_x86\crt\src\fprintf.c

FAULTING_SOURCE_LINE_NUMBER: 55

FAULTING_SOURCE_CODE:
No source found for 'f:\dd\vctools\crt_bld\self_x86\crt\src\fprintf.c'


SYMBOL_NAME: msvcr90!fprintf+34

MODULE_NAME: msvcr90

IMAGE_NAME: msvcr90.dll

STACK_COMMAND: ~19s; .ecxr ; kb

FAILURE_BUCKET_ID: INVALID_CRUNTIME_PARAMETER_c0000417_msvcr90.dll!fprintf

從錯(cuò)誤信息看,問(wèn)題是出在 satrda.dll 這個(gè)第三方庫(kù),趕緊網(wǎng)上搜一下是這是何方神圣。

圖片

看樣子是一個(gè)連接數(shù)據(jù)庫(kù)的商業(yè)組件,接下來(lái)看下 FAILURE_BUCKET_ID: INVALID_CRUNTIME_PARAMETER_c0000417_msvcr90.dll!fprintf 信息,可以發(fā)現(xiàn)因?yàn)樵谡{(diào)用 fprintf 函數(shù)時(shí)出現(xiàn)了參數(shù)錯(cuò)誤,到這里我們將包圍圈極大的收縮了。

2. 為什么會(huì)出現(xiàn)參數(shù)錯(cuò)誤

熟悉 C 語(yǔ)言 fprintf 函數(shù)的朋友都知道,它是用來(lái)向 文件 寫(xiě)入數(shù)據(jù)的,類似 C# 的 WriteFile,既然報(bào)了參數(shù)異常,那就說(shuō)明肯定在參數(shù)上出了問(wèn)題,接下來(lái)看下它的簽名。

int fprintf(
FILE *stream,
const char *format [,
argument ]...
);

有了這些基礎(chǔ)之后切到 19 號(hào)線程觀察下它的調(diào)用棧。

0:019> ~19s; .ecxr ; kb 10
eax=14c9cd00 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=14c9d664
eip=682a024a esp=14c9cfd4 ebp=14c9d018 iopl=0 nv up ei pl nz ac po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000212
msvcr90!fprintf+0x34:
682a024a 83c414 add esp,14h
# ChildEBP RetAddr Args to Child
00 14c9d018 1766013b 00000000 176d9c60 17def1a8 msvcr90!fprintf+0x34 [f:\dd\vctools\crt_bld\self_x86\crt\src\fprintf.c @ 55]
WARNING: Stack unwind information not available. Following frames may be wrong.
01 14c9d664 454c5153 75636578 203a6574 5332347b satrda!Writer_Write+0x4bb
02 000000c8 75636578 203a6574 5332347b 207d3230 0x454c5153
03 000000c8 17673623 17d538e8 17ded730 00000001 crypt32!profapi_NULL_THUNK_DATA_DLA <PERF> (crypt32+0x126578)
04 00000009 176604b6 14c9d74c 17ded730 17dae9c8 satrda!SATRDA_Proto_UnitTest+0x6c93
05 ffffffff 17654012 17dae9c8 17d538e8 17ded730 satrda!Writer_Write+0x836
06 17dae9c8 665fe072 14c9d74c 00000001 1765405b satrda!ConfigDSN+0xd0c2
07 17ded730 63207463 2c44492e 6f532e63 632c7472 clr!CompressDebugInfo::CompressBoundariesAndVars+0x2d0
08 656c6573 2c44492e 6f532e63 632c7472 7261502e 0x63207463
09 656c6573 6f532e63 632c7472 7261502e 49746e65 0x2c44492e
0a 656c6573 69482e63 6e656464 4c2e632c 6c657665 Microsoft_Build_Tasks_v4_0_ni+0x2f2e63
0b 2c687461 6e656464 4c2e632c 6c657665 64646948 System_ServiceModel_Web_ni+0xf2e63
0c 69482e63 4c2e632c 6c657665 64646948 632c6e65 System_Runtime_Serialization_ni+0x226464
0d 6e656464 6c657665 64646948 632c6e65 6d6f432e 0x4c2e632c
0e 6e656464 64646948 632c6e65 6d6f432e 656e6f70 System_ServiceModel_ni+0x537665
0f 6c657665 632c6e65 6d6f432e 656e6f70 632c746e 0x64646948

從線程棧來(lái)看 msvcr90!fprintf 函數(shù)的第一個(gè)參數(shù)居然是 00000000 ,也就是說(shuō) *stream 這個(gè)參數(shù)為 NULL,難怪說(shuō)參數(shù)異常!

3. 為什么 stream 為空

熟悉 C 的朋友應(yīng)該知道 *stream 參數(shù)是通過(guò) fopen 函數(shù)得到的,可能有些朋友有點(diǎn)混,這里就寫(xiě)個(gè)簡(jiǎn)單的模型吧。

int main()
{
FILE* pFile;
int n;
char name[100];

pFile = fopen("D:\\dumps\\myfile2.txt", "w");

gets_s(name, 100);

fprintf(pFile, "%s", name);

fclose(pFile);

return 0;
}

接下來(lái)我們到 dump 中尋找一下 fopen 函數(shù),這個(gè)在線程棧上是沒(méi)有了,先提取出 msvcr90!fprintf+0x34 中的 RetAddr=1766013b 返回值地址到匯編窗口查找,截圖如下:

圖片

從圖中可以看到,esi 是 eax 給的,而 eax 是 call 返回值給的,不出意外 176D727Ch 中存的就是 fopen 函數(shù),輸出如下:

0:019> u poi(176D727Ch)
msvcr90!fopen [f:\dd\vctools\crt_bld\self_x86\crt\src\fopen.c @ 123]:
682a01a2 8bff mov edi,edi
682a01a4 55 push ebp
682a01a5 8bec mov ebp,esp
682a01a7 6a40 push 40h
682a01a9 ff750c push dword ptr [ebp+0Ch]
682a01ac ff7508 push dword ptr [ebp+8]
682a01af e825ffffff call msvcr90!_fsopen (682a00d9)
682a01b4 83c40c add esp,0Ch

接下來(lái)我們需要提取 fopen 中的兩個(gè)參數(shù),截圖如下:

圖片

第二個(gè)參數(shù)很好獲取就是 176D9C60h 的 ascii 表示,第一個(gè)參數(shù)獲取起來(lái)就麻煩了,我們需要詳細(xì)的如圖那樣推測(cè)當(dāng)時(shí)的 esp 指向的位置。

0:019> da 14c9d074
14c9d074 "0810"
0:019> da 176D9C64h
176d9c64 "at++"

還原成 C 代碼大概就是:

FILE*  pFile = fopen("0810", "at++");

代碼大概是恢復(fù)出來(lái)了,那為什么會(huì)拋異常呢?windbg 有一個(gè) !gle 命令可以查看當(dāng)時(shí)發(fā)生了什么錯(cuò)誤。

0:019> !gle
LastErrorValue: (NTSTATUS) 0 (0) - STATUS_SUCCESS
LastStatusValue: (NTSTATUS) 0xc000003a - { } %hs

接下來(lái)到微軟的官方文檔:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/596a1078-e883-4972-9bbc-49e60bebca55 找一下這個(gè) 3a 到底表示啥意思,截圖如下:

圖片

從圖中看,原來(lái)是路徑不存在的錯(cuò)誤,應(yīng)該就是沒(méi)找到 0810 這個(gè)文件。

到這里就基本弄清楚了來(lái)龍去脈,應(yīng)該是朋友的服務(wù)器有意或者無(wú)意清理了由 satrda 生成的 0810 文件,引發(fā) satrda.dll 找不到文件路徑導(dǎo)致的程序崩潰,將這些信息提供給朋友之后,讓朋友去找 satrda 官網(wǎng)去了解下詳情,畢竟官方才是最清楚的。

三:總結(jié)

這次事故是由于 satrda 層面找不到文件路徑導(dǎo)致的程序崩潰,據(jù)朋友說(shuō)在 C# 層面沒(méi)收到這種C++異常,確實(shí)當(dāng) C# 和 C++ 產(chǎn)生交互時(shí)經(jīng)常會(huì)有各種奇怪的問(wèn)題,我無(wú)意刪除你的,你無(wú)意干擾我的,大家都好自為之吧??????

責(zé)任編輯:武曉燕 來(lái)源: 一線碼農(nóng)聊技術(shù)
相關(guān)推薦

2023-06-26 00:12:46

2024-03-28 12:56:36

2024-03-26 00:44:53

.NETCIM系統(tǒng)

2023-06-29 17:55:00

.NET日志WinDbg

2024-07-09 11:51:20

Windows線程池源碼

2024-12-27 13:31:18

.NETdump調(diào)試

2024-06-04 10:54:34

.NET代碼程序

2024-07-12 11:20:34

.NET崩潰視覺(jué)程序

2024-05-31 12:56:06

.NET代碼方法

2022-10-25 14:17:01

.NET代碼程序

2024-06-13 17:09:55

2022-10-13 18:40:05

.NETOA后端

2023-04-06 10:52:18

2024-08-27 13:08:50

2024-07-01 13:00:24

.NET網(wǎng)絡(luò)邊緣計(jì)算

2024-11-29 10:06:59

2022-01-17 21:28:36

管理系統(tǒng).NET

2022-10-10 17:52:08

CPUERP系統(tǒng)

2024-08-08 11:21:01

2021-11-02 07:54:41

內(nèi)存.NET 系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91素人 | 久久久黄色| 久久国产电影 | 黑人精品xxx一区一二区 | 亚洲精品aⅴ | 久久久久久成人 | 国产高清一区二区三区 | 久久亚洲一区二区 | 精品国产99 | 亚洲一区二区视频在线观看 | 日韩视频精品在线 | 欧美日韩综合一区 | 日韩一区二区av | 欧美精品综合 | 午夜一区二区三区在线观看 | 精品久久不卡 | 欧美三级三级三级爽爽爽 | 亚洲欧美激情精品一区二区 | 黄色大片网| aaaaaaa片毛片免费观看 | 久久久av | 不卡一区 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 免费黄色大片 | 涩涩视频网站在线观看 | 日韩一及片 | 精品av | 亚洲国产免费 | 中文字幕亚洲一区二区va在线 | 国产精品成人国产乱 | 精品毛片在线观看 | 亚洲日本欧美日韩高观看 | 91亚洲国产成人久久精品网站 | 亚洲www啪成人一区二区麻豆 | 91精品国产综合久久香蕉麻豆 | 欧美日韩高清在线一区 | 亚洲免费观看视频网站 | 黄色在线免费观看 | 国产亚洲精品91 | 国产91视频免费 | 午夜视频在线免费观看 |