從以前一直研究基金方面的資訊,但由於沒有多於的時間常常觀看,再加上碩士時在我們老師的指導下,我將基金的資訊透過 Data Mining的模式進行分析,但由於Data Mining需要大量的資訊,所以我設計了一個資料搜集器,會從各大網站中進行基金資訊的收集,而這個程式我是從 c# 2.0的時候就開始寫了,功能不斷的增加,原本初期是希望透過排程自動化處理,但是一直以來有一個小問題,由於我的系統中使用了多個執行緒,所以有時候系統會卡住不動,然後就一直停住,而且有時候是不預期的發生,所以這支蟲我也捉了好久,由其是在功能不斷的新增之後,還是沒有改善。

最近在公司知道有一個好工具可以進行分析,名稱為WinDbg,所以我就拿這個問題來小試身手,我將安裝步驟與解決方法列於下方,再請大家多多參考。

1、下載 WinDbg 工具

1-1. 先至微軟的官方網站下載,此工具分成兩個版本,一個是32位元,一個是64位元,基本上這不是取絕於你的OS為何,而是你要除錯的程式為32位元還是64位元,那要如何分辨呢?最簡單的方式就是透過工作管理員確認即可。

下載網址:
http://msdn.microsoft.com/en-us/windows/hardware/gg463009

2、重現應用程式卡住的情況,然後進行下列的動作,收集dump files。
  
2-1. 確認應用程式執行的是32還是64位元的。

2-2. 啟動一個命令視窗,切換至安裝目錄下:

  • x32 -> C:\Program Files (x86)\Debugging Tools for Windows (x86)
  • x64 -> C:\Program Files\Debugging Tools for Windows (x64)

2-3. 由於我的應用程式是Hang的情況,所以請執行下列的指令:

adplus.exe -hang -quiet -pn fund.vshost.exe -o c:\dumps

     參數說明:

  • -hang 執行adplus在Hang的模式。
  • -o 指定輸出路徑
  • -quiet 不跳出快顯視窗
  • -pn 指定應用程式的名稱
 
2-4. 確認在 c:\dumps 的檔案夾下是否有產生dump files

3、設定 WinDbg 的環境

3-1. 開啟 windbg 之後,選擇 [File] -> [Symbol File Path]

3-2. 在開啟的視窗中輸入下列的資訊:

SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols

4、分析 Dump Files

4-1 開啟 WinDbg

 
4-2. 載入後,所以的動作皆需透過指令的方式完成,而輸入的地方就在下方 [0:000 >] 的旁邊。

4-3. 輸 [k] 觀察程式中 stack的狀態,輸入後你會發現出現許多的 mscorwks 這也代表您的應用程式是執行在.Net之下。

4-4. 由於我們觀察 .Net的相關記憶體與物件資料,所以需要載入 sos.dll,請在命令視窗中輸入下列的指令。

.loadby sos mscorwks

4-5. 載入後我們 透過下列的指令來確認目前.net 中 stack的情況。

~*e!clrstack

4-6. 透過4-5的指令可能會列出許多的資訊,請仔細觀察後,終於找到卡住的地方,也就是下列紅色圈起來的地方,主要是卡在 [set_page_property],因為這個函式中有一個迴圈會不斷的等待執行緒的回傳,我作了兩個動作,一是初使值的設定,二是等待超過1分鐘就強迫停止這一個執行緒的資料捉取,所以改完後問題就解決了。

 

PS:在上圖中有一個箭頭由下往上,主要指的是由於這是一個stack的資料結構,所以你可以看出是由 Update_basic() -> external_company() -> set_page_property(),藉以了解執行的順序。

參考連結:
WinDbg Command-Line Options
http://msdn.microsoft.com/en-us/library/ff561306(v=vs.85).aspx
SOS.dll (SOS Debugging Extension)
http://msdn.microsoft.com/en-us/library/bb190764.aspx
Debugging Tools and Symbols: Getting Started
http://msdn.microsoft.com/en-us/windows/hardware/gg462988

.net 程式進階除錯教學 - 使用WinDbg的更多相关文章

  1. [How To] TrueCrypt使用教學 - 重要資訊的加密保險箱(转)

    我在2013年八月的時候寫了這篇關於TrueCrypt的使用教學,但從去年(2014)五月下旬開始,TrueCrypt的首頁出現了"Using TrueCrypt is not secure ...

  2. 【NS2】NS2 教學手冊(转载)

    之前做毕设的时候搜索NS2的相关资料,发现这个里面涵盖很广,特此收藏,感谢原作者的辛勤劳作. NS2 教學手冊 ( NS2 Learning Guide) [快速連結區] My works  中文影音 ...

  3. MQTT教學(二):安裝MQTT伺服器Mosquitto,Windows系統篇

    http://swf.com.tw/?p=1005 「認識MQTT」文章提到,MQTT的訊息全都透過稱為代理人(broker)的伺服器交流.本文將說明頗受歡迎的開放原始碼MQTT伺服器Mosquitt ...

  4. 【转】Jollen 的 Android 教學,#12: 如何建立選單 Menu

    原文网址:http://www.jollen.org/blog/2009/06/jollen-android-programming-12.html Android應用程式的UI可以使用XML來定義, ...

  5. 如何利用 VisualStudio2019 遠端工具進行偵錯

    Hi 這次要來介紹 如何使用 Visual Studio 2019 遠端工具進行 Release 應用程式偵錯 首先我們先下載 2019 專用的遠端工具(這裡依照不同的 VisualStudio 版本 ...

  6. [Java] 歐付寶金流串接教學

    前言: 很多接案的人,都會碰到需要接金流的時候.而歐付寶是個台灣的金流平台. 這邊記錄下,串接的心得.我用的語言是Java, 採liferay這個portal平台,不過這份教學當然適合servlet. ...

  7. VPN Gate Client v4.11-免費、無限流量VPN翻牆(跳板)軟體(使用教學)

    VPN Gate Client安裝教學 ▼把下載的檔案壓縮後,開啟安裝檔案. ▼接下來就是一般安裝步驟,下一步>下一步   ▼同意>下一步>下一步   ▼安裝目錄可以用預設的也可以自 ...

  8. 進階gdb之core dump的除錯

    core dump的除錯 Basic Perl等語言處理的可以說是User的資料, C可以說在那邊把資料在記憶體移來移去, 組語可說把資料在暫存器搬來搬去, 越低階的處理表示握有的資源越少 所以C處理 ...

  9. MQTT教學(一):認識MQTT

    http://swf.com.tw/?p=1002 本系列文章旨在補充<超圖解物聯網IoT實作入門>,採用Arduino.ESP8266和Node.js實作MQTT物聯網通訊實驗. MQT ...

随机推荐

  1. Scrapy爬虫:抓取大量斗图网站最新表情图片

      一:目标 第一次使用Scrapy框架遇到很多坑,坚持去搜索,修改代码就可以解决问题.这次爬取的是一个斗图网站的最新表情图片www.doutula.com/photo/list,练习使用Scrapy ...

  2. 动态计算文本的CGSize

    // 计算文本的size -(CGSize)sizeWithText:(NSString *)text maxSize:(CGSize)maxSize fontSize:(CGFloat)fontSi ...

  3. 如何实现artTemplate模板的可重用性,以此框架打造自己的自定义组件

    问题的提出: 我们为什么非得要引入artTemplate来进行JSON数据的渲染呢? http://dagmom.iteye.com/blog/1671498http://bbs.csdn.net/t ...

  4. [Bootstrap]modal弹出框

    写在前面 在实际开发中,为了友好,更需要一种美观的弹出框,js原生的alert,很难满足需求.这里推荐一个bootstrap的弹出框. 一个例子 先看效果吧 代码: <!DOCTYPE html ...

  5. vue之v-text渲染多值

    其原理,是利用vue里的computed计算属性来做. 请看代码: <div id='app'> <div v-text="newUsers"></d ...

  6. LoadRunner:关联HTTP请求

    LoadRunner:关联HTTP请求 本例通过一个使用HTTP/HTML协议发送.获取服务器数据的vuser脚本,分析LoadRunner如何进行HTTP关联. 下面这个例子包括两个事务:上传数据到 ...

  7. nginx代理缓存

    (1)缓存介绍 1.代理服务器端缓存作用 减少后端压力,提高网站并发延时 2.缓存常见类型 服务器端缓存:代理缓存,获取服务器端内容进行缓存 浏览器端缓存 3.nginx代理缓存:proxy_cach ...

  8. H264(ES)如何打包成H264(PES)

    http://blog.csdn.net/u013898698/article/details/64919036 http://blog.csdn.net/cabbage2008/article/de ...

  9. linux在命令执行过程中ctrl +z 后[1]+ Stopped

    进程挂起 stopped 代表有进程挂起 [1]是id号 可以通过Linux命令:jobs 查看挂起进程 fg 1 把任务1放到前台 bg 1 把任务1放到后台

  10. 转:Python安全 - 从SSRF到命令执行惨案

    转:https://www.leavesongs.com/PENETRATION/getshell-via-ssrf-and-redis.html Python安全 - 从SSRF到命令执行惨案 PH ...