2011年11月30日 星期三

泡麵式安裝法(上集) - 如何大量並快速的安裝 SQL Server

        SQL Server 資料庫的安裝,我想大家都已經非常的熟悉了,如果您還是不熟的話可以參考此網站的文章先進行學習,但是當要進行大量部署時,這個就有點麻煩了,在以往大家都是透過類似 Ghost 的方式來製作成映像之後,然後再進行映像還原,但是這樣會有一個問題,就是會造成每一個還原的作業系統中,內部的識別碼 (SID) 都會相同。

         熟悉安裝的人員,相信都知道這個情況,當然為了解決這個問題,微軟推出了 NewSID 這個工具讓大家下載,後來更加入了 SysPrep 這個工具讓使用者可以重新進行Windows的初使化,所以很多腦筋動的快的人已想到透過這個方法,將 Windows 與 SQL Server 裝好後,然後再透過 SysPrep 的方式進行就好,但是又有一個問題,由於 SysPrep 是重新初使化 Windows,所以SQL Server你需要在還原後,重新更改主機的名稱,更改方法可以參考我的另一篇文章 [如何更換 SQL Server 的主機名稱] ,而且裝好的 Instance 也不能更改名稱,所以有許多網站也不建議透過這個方式,所以大部份的作法,在進行大量部署時,只能將 Windows 先製成映像檔,還原後再進行安裝 SQL Server,但是這樣也要花費不少時間。

PS:由於在Windows Vista 之後,SysPrep 已經有內建了,所以建議最好透過此工具來進行,而且在下載NewSID的網頁中也有寫明,不提供技術支援從NewSID還原安裝的作業系統,只支援透過 SysPrep 的方式。

         由於這個問題當然微軟也注意到了,所以在 SQL Server 2008 R2 以後,推出了一個新的功能可以將SQL Server的核心製成一個映像,透過此方法與 SysPrep 的結點,就可以快速的進行安裝,因為在準備安裝到安裝完成,在我的電腦上(只是一般的PC + Hyper-V),只要三分鐘,所以我才會取命為 [泡麵式安裝法]。以下我們就來介紹如何進行,但由於過程較多,所以我分成二篇文章進行說明。

在進行前我也先將限制進行說明,我截取官方網站的說明如下:
SQL Server SysPrep 限制
  • SQL Server 容錯移轉叢集安裝不支援 SQL Server SysPrep。
  • 只有 SQL Server 的 Database Engine 和 Reporting Services 才支援 SQL Server SysPrep。
  • SQL Server SysPrep 安裝不支援 SQL Server 工具。
  • SQL Server SysPrep 安裝不支援 IA-64 安裝。
  • 不支援修復備妥的執行個體。如果安裝程式在準備映像或完成映像步驟期間失敗,您必須執行解除安裝。
  • 您不能在執行的 SQL Server 版本早於 SQL Server 2008 R2 的電腦上準備 SQL Server 2008 R2 執行個體。
  • 當已經有備妥的 SQL Server 執行個體時,您可以安裝支援的 SQL Server 版本。例外狀況是 SQL Server 2005。SQL Server 2005 安裝不支援電腦上現有且未設定的已備妥 SQL Server Browser。將 SQL Server 2005Database Engine 或 Analysis Services 與現有的已備妥 SQL Server 2008 R2Database Engine 執行個體一起安裝在電腦上會造成 SQL Server 2005 安裝失敗,因為準備映像包含 SQL Server Browser。在您安裝 SQL Server 2005Database Engine 或 Analysis Services 之前,必須先完成備妥的 SQL Server 2008 R2 執行個體。

安裝流程:
1、安裝完成Windows之後,接著放入SQL Server的安裝光碟,然後選擇 [準備 SQL Server 獨立執行個體的映像]。

2、確認程式的支援規則,點選確定。

3、此步驟會檢查需安裝的檔案,選擇安裝直接進行。

4、此步驟會檢查您目前的環境是否支援 SQL Server SysPrep。

5、授權條款確認。

6、選擇您需要的服務有那些,請注意,這些特徵在後面是不能更動的,所以選擇前請仔細評估,而目前在 SQL Server 2008 R2中可以選擇的只有下列幾種,其他的如 SSAS 與 SSIS 並不支援。

7、這裡的識別碼名稱並非 Instance Name,只是到時候 SQL Server 的目錄名稱而已,到時候安裝時,才會需要指定 Instance Name。

8、磁碟空間需求確認,點選下一步。

9、映像規則檢查,點選下一步。

10、準備開始製作映像,這裡會列出您之前的選項,您可以在此再加以確認。

11、安裝完成。

此時 SQL Server SysPrep就已完成,再來就是進行 Windows 的 SysPrep。

12、點選執行後,輸入 [sysprep]。

13、此時會跳到 [sysprep] 的目錄中,再點選 [sysprep] 即可。

14、此時請將 [一般化] 勾選起來,然後關機選項請選擇 [關機],然後選擇 [確定]。


15、關機後,就可以將這個作業系統作成一個映像檔,由於我是透過 Hyper-V進行的,所以只需將VHD的檔案拷貝出來即可。

上述的動作主要進行 Windows 與 SQL Server 的 SysPrep,下一篇我們將來介紹如何透過這個映像檔來進行安裝,再請大家持續支持。


相關連結:

參考說明:

關鍵字:SQL ServerHyper-VSysPrepSIDNewSIDSQL Server SysPrep

2011年11月25日 星期五

SQL Server - 如何新增叢集磁碟與相依性設定

        前面幾個單元主要介紹如何在將SQL Server架設在 Cluster之上,如果不清楚的部份,請參考我下列著作,而這篇,主要是介紹當你架設完 Cluster 之後,如何進行磁碟新增的動作,我將詳細的作法附上,提供給大家參考。

相關文章:
  1. SQL Server 2008 R2 容錯移轉叢集環境架設 - 利用 VM 與 Windows Storage Server - Part I
  2. SQL Server 2008 R2 容錯移轉叢集環境架設 - 利用 VM 與 Windows Storage Server - Part II
  3. SQL Server 2008 R2 容錯移轉叢集環境架設 - 利用 VM 與 Windows Storage Server - Part III(終)
  4. 容錯移轉叢集中多個節點切換順序的設定

設定流程:
1、由於我是透過 Windows Storage Server 與 iSCSI的方式進行架設,所以 先到 iSCSI Targets中新增一顆硬碟。

2、新增完成後,切換到目前叢集上的節點,然後到 [存放] -> [磁碟管理],你就可以看到上一步驟中所新增的磁碟,但是由於是新增的,無法直接使用,所以請先將此磁碟設定成可使用的狀態,如果不清楚,再請參考我的另一篇文章 [SQL Server 2008 R2 容錯移轉叢集環境架設 - 利用 VM 與 Windows Storage Server - Part I]。

3、點選到 [容錯移轉叢集管理員] -> [服務與應用程式] -> [SQL Server] -> [新增存放裝置]

4、點選已新增的存放裝置,再點選確定即可。如果在這個步驟中無法看到剛剛新增上的叢集磁碟時,請執行 [容錯移轉叢集管理員] -> [叢集名稱] -> [驗證設定] 。

5、加入後你就可以在磁碟機的群組中看到已加入的叢集磁碟,但是此時你到SQL Server的備份中,還是選擇不到這一台磁碟機,所以再請接續進行。

6、點選 [容錯移轉叢集管理員] -> [叢集名稱] -> [其他資源] -> [SQL Server] -> [內容]

7、切換到 [相依性]的頁次中,將剛新增的磁碟加入資源中。

8、最後再到SQL Server 備份的功能中,你就可以選擇新增加的磁碟了。


關鍵字:SQL ServerClusterDisk相依性

2011年11月24日 星期四

SQL Server - 如何列出目前已賦予或限制的權限清單

        資料庫除了要有良好的處理效能外,安全性也是非常重要的一環,而在資料庫中主要透過  GRANT 與 REVOKE 來賦予使用者權限或限制存取的權限,而這兩個指令的用法,我就不在這裡多說,您可以參考下列的連結,但是當我希望可以進行安全性控管時,需要每日監控有那些已賦序或已限制的清單時,總不能透過逐一統計的方式,所以我提供了下列的語法,大家如果有針對使用者進行權限的 GRANT 或 REVOKE時,就可以透過下列的指令列出目前的資料庫中已設定的清單。
範例說明:
假設我有一個資料庫名稱為 [cary_test] ,其中有一個使用者名稱為 [test_user],我希望此使用者針對 [test] 的資料表只能有新增,但不能有刪除的功能。

1、選擇 [test_user]的使用者。

2、設定 GRANT -> INSERT,REVOKE -> DELETE

3、透過下列的語法進行查詢,即可得到 GRANT 與 REVOKE的清單。

4、上述的安全性稽核清單,您需要每天進行確認時,您可以使用 Reporting Service 作成報表後,透過訂閱的方式進行寄送,這樣就可以每天在固定的時間寄送到您的信箱了。

查詢語法:
USE cary_test;

SELECT [ROLE] = su.name, [OBJECT] = so.name,
[OBJECT TYPE] = CASE so.type
WHEN 'C' THEN 'CHECK constraint'
WHEN 'D' THEN 'Default or DEFAULT constraint'
WHEN 'F' THEN 'FOREIGN KEY constraint'
WHEN 'FN' THEN 'Scalar function'
WHEN 'IF' THEN 'Inlined table-function'
WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint'
WHEN 'L' THEN 'Log'
WHEN 'P' THEN 'Stored procedure'
WHEN 'R' THEN 'Rule'
WHEN 'RF' THEN 'Replication filter stored procedure'
WHEN 'S' THEN 'System table'
WHEN 'TF' THEN 'Table function'
WHEN 'TR' THEN 'Trigger'
WHEN 'U' THEN 'User table'
WHEN 'V' THEN 'View'
WHEN 'X' THEN 'Extended stored procedure'
ELSE 'OTHER'
END, sc.name 'COLUMN NAME', 
[ACTION] = CASE sp.action
WHEN 26 THEN 'REFERENCES'
WHEN 178 THEN 'CREATE FUNCTION'
WHEN 193 THEN 'SELECT'
WHEN 195 THEN 'INSERT'
WHEN 196 THEN 'DELETE'
WHEN 197 THEN 'UPDATE'
WHEN 198 THEN 'CREATE TABLE'
WHEN 203 THEN 'CREATE DATABASE'
WHEN 207 THEN 'CREATE VIEW'
WHEN 222 THEN 'CREATE PROCEDURE'
WHEN 224 THEN 'EXECUTE'
WHEN 228 THEN 'BACKUP DATABASE'
WHEN 233 THEN 'CREATE DEFAULT'
WHEN 235 THEN 'BACKUP LOG'
WHEN 236 THEN 'CREATE RULE'
ELSE 'OTHER'
END,
[PROTECT TYPE] = CASE sp.protecttype
WHEN 204 THEN 'GRANT_W_GRANT'
WHEN 205 THEN 'GRANT'
WHEN 206 THEN 'REVOKE'
ELSE 'OTHER'
END,
[PROTECTION APPLIES] = CASE
WHEN sp.columns = 1 THEN 'ALL COLUMNS'
WHEN sp.columns > 1 THEN 'SPECIFIC COLUMNS'
ELSE 'N/A'
END
FROM sysprotects sp
INNER JOIN sysusers su ON sp.uid = su.uid
INNER JOIN sysobjects so ON so.id = sp.id
INNER JOIN syscolumns sc ON so.id = sc.id
ORDER BY su.name, so.name, sp.action


參考連結:
GRANT Server Permissions (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms186717.aspx
REVOKE Server Permissions (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms186308.aspx

關鍵字:SQL ServerGRANTREVOKESECURITYPermission

2011年11月20日 星期日

SQL Server 2012 Release Candidate 0(RC0) 下載說明與安裝問題排除

        SQL Server 2012 講了這麼久,終於也要到倒數的階段了,目前已可以在官網下載RC0的版本,此版本主要的新特色如下所示,其中最令人矚目當然就是AlwaysOn的功能,關於此功能的說明與架設方式,大家可以參考我的另一篇文章 [SQL Server 2012 - AlwaysOn 安裝與設定教學]。

         當從官網下載之後,安裝的方式大致上與上一個版本差不多,所以請大家參考我的另一篇文章 [SQL  Server 2012 (CTP3) 開放下載與安裝介紹],在這邊我就只介紹一此較特別的部份,其他的我就不多說了。

安裝步驟:
1、在一開始安裝時,由於我是安裝在Windows 2008R2上,所以他們限制必須先下載 Windows 2008R2 SP1之後才可以進行後續的安裝。


2、在啟動畫面上,你也可以看到首次正名後的名稱 [SQL Server 2012]。

3、在選擇安裝後,此次也會嘗試的檢查是否有新的更新檔案。

4、在特徵選取上,你也可以看到許多新的功能可以進行安裝。

5、當我安裝到 [Distributed Replay Controller] 的時候,我竟然發生了下列的錯誤訊息,但奇怪的是,我只是單機安裝而已,但是底下的說明卻看起來是 Cluster 的錯誤,查看了安裝紀錄檔也是相同的錯誤訊息 [在驗證函數 ValidateUsers 中驗證設定 CTLRUSERS 時發生失敗。],安裝了二、三次也是相同的問題,後來經過我的同事的指點,也終於解決了。


這個問題主要是因為此功能需要透過網域帳號來控管,當你加入一個非網域帳號時,就會發生上述的情況,解決方法就是在 [Distributed Replay Controller] 的流程中不加入一個指定的管理者,只要維持空白即可,如下所示,然後再一直安裝到最後即可。


6、安裝完成後,啟動Management Studio畫面


7、登入後,你就可以看到 版本的部份,目前就是 [11.0.1750]。

以上就是此 RC0 的版本說明與安裝解決的方法,待後續有新的使用心得,再與大家分享。

新增特色:
  • 以 AlwaysOn 提供需要的執行時間和資料保護
  • 以資料行存放區索引取得突破性及可預測的效能
  • 協助以新的使用者定義角色與群組的預設結構描述達到安全性與符合性
  • 能夠以資料行存放區索引迅速探索資料,讓整個組織都有更深入的洞見
  • 以 SSIS 改進功能、Excel 的 Master Data Services 增益集和新的 Data Quality Services,確保可信而一致的資料
  • 以資料層應用程式元件 (DAC) 同位檢查,跨伺服器與雲端最佳化 IT 和開發人員生產力,並以 SQL Azure 與 SQL Server 資料工具,取得跨資料庫、BI 和雲端功能達到一致的開發經驗

系統要求:
  • 支援的作業系統:Windows 7;Windows Server 2008 R2;Windows Server 2008 Service Pack 2;Windows Vista Service Pack 2
  • 32 位元系統
  • 備有 Intel 或相容 1GHz (或更快) 處理器 (建議使用 2 GHz 或更快) 的電腦。
  • 64 位元系統
  • 1.4 GHz 或更快的處理器
  • 最少 1 GB RAM (建議 2 GB 或以上)。
  • 2.2 GB 的可用硬碟空間

錯誤訊息:
Exception type: Microsoft.SqlServer.Chainer.Infrastructure.ValidateSettingException
    Message:
        在驗證函數 ValidateUsers 中驗證設定 CTLRUSERS 時發生失敗。
    HResult : 0x85640004
        FacilityCode : 1380 (564)
        ErrorCode : 4 (0004)
    Data:
      SettingId = CTLRUSERS
      ValidationName = ValidateUsers
      WatsonData = Microsoft.SqlServer.Chainer.Infrastructure.ValidateSettingException@4
      HelpLink.EvtType = 0x601E39D7
      DisableWatson = true
    Stack:
        於 Microsoft.SqlServer.Chainer.Infrastructure.Setting.Validator.Validate()
        於 Microsoft.SqlServer.Deployment.PrioritizedPublishing.PublishingQueue.CallQueuedSubscriberDelegates()
        於 Microsoft.SqlServer.Deployment.PrioritizedPublishing.PublishingQueue.Publish(Publisher publisher)
        於 Microsoft.SqlServer.Chainer.Infrastructure.Setting`1.set_Value(T value)
        於 Microsoft.SqlServer.Chainer.Infrastructure.Setting`1.SetValue(Object newValue, InputSettingSource source)
        於 Microsoft.SqlServer.Chainer.Infrastructure.InputSettingService.SetSettingValue[T](String settingName, T value, InputSettingSource source)
        於 Microsoft.SqlServer.Configuration.Property`1.SetValueAndSource(Object value, InputSettingSource source)
        於 Microsoft.SqlServer.Configuration.InstallWizard.DistributedReplayControllerAccountProvisionController.UpdateUserAccounts()
        於 Microsoft.SqlServer.Configuration.InstallWizard.AccountProvisioningController.AddCurrentUserAccount()
        於 System.Windows.Forms.Control.OnClick(EventArgs e)
        於 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
        於 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
        於 System.Windows.Forms.Control.WndProc(Message& m)
        於 System.Windows.Forms.ButtonBase.WndProc(Message& m)
        於 System.Windows.Forms.Button.WndProc(Message& m)
        於 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
        於 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    Inner exception type: Microsoft.SqlServer.Configuration.Sco.ScoException
        Message:
                指定的本機群組不存在。
               
        HResult : 0x84bb0001
                FacilityCode : 1211 (4bb)
                ErrorCode : 1 (0001)
        Data:
          WatsonData = Administrator
          DisableRetry = true
        Stack:
                於 Microsoft.SqlServer.Configuration.Sco.UserGroup.Exists()
                於 Microsoft.SqlServer.Configuration.DistributedReplay.ControllerUsersSetting.ValidateSingleAccount(String accountName)
                於 Microsoft.SqlServer.Configuration.DistributedReplay.ControllerUsersSetting.ValidateUsers()
                於 Microsoft.SqlServer.Deployment.PrioritizedPublishing.PublishingQueue.CallFunctionWhileAutosubscribing[T](SubscriberDelegate subscriberDelegate, Int32 priority, AutosubscribingFunctionDelegate`1 function)
                於 Microsoft.SqlServer.Chainer.Infrastructure.Setting.Validator.Validate()
        Inner exception type: System.Runtime.InteropServices.COMException
            Message:
                        指定的本機群組不存在。
                       
            HResult : 0x80070560
            Stack:
                        於 System.DirectoryServices.DirectoryEntries.Find(String name, String schemaClassName)
                        於 Microsoft.SqlServer.Configuration.Sco.UserGroup.Exists()


參考網址:
MicrosoftR SQL ServerR 2012 Release Candidate 0 (RC0)
http://www.microsoft.com/downloads/zh-tw/details.aspx?FamilyID=3df53bd9-cde1-466e-b3d1-9884d46c897c
Windows 7 和 Windows Server 2008 R2 Service Pack 1 (KB976932)
http://www.microsoft.com/downloads/zh-tw/details.aspx?familyid=c3202ce6-4056-4059-8a1b-3a9b77cdfdda&displaylang=zh-tw

關鍵字:SQL ServerDenaliRC0Release Candidate

2011年11月18日 星期五

如何提高 SQL Server 2005 以前版本的安全性

        在SQL Server 2005(含)以前,安裝的時候,系統都會自動將Administrators的群組自動加入,成為SQL Server的系統管理員,但由於許多公司的資安規定與個人資料保護法的通過後,能存取資料庫的人就會越來越限定,而且Domain Administrator也不一定是資料庫管理者,這個情況雖然在SQL Server 2008以後已不會再發生,但是在SQL Server 2005之前,情況還是存在,因為預設就會加入,而且此群組無法停用,所以本篇主要介紹如何進行 [BUILTIN\Administrators] 群組的移除。


設定前確認事項:
  1. 請確認當您移除 [BUILTIN\Administrators] 群組之前,您要確保仍有其他Windows帳號的使用者擁有sysadmin的權限並且可以登入到資料庫中,以免造成沒有管理者可以登入的情況發生。
  2. 如果您不是使用 Windows 整合驗證進行管理時,請確認您可以透過 SA 的身份登入,另外也請確認登入時的認證模式要確認有啟用混合模式。



設定流程:
  1. 移除Administrator群組在資料庫中的權限。
    exec sp_dropsrvrolemember [BUILTIN\Administrators] , sysadmin
    go;
  2. 移除Administrator群組登入的權限
    drop login [BUILTIN\Administrators]
    go;

PS:由於Domain Admin是對應到 [BUILTIN\Administrators] 的群組,所以刪除此帳號後,Domain Admin也會相對無法進行管理。

關鍵字:SQL ServerBUILTIN\AdministratorsSecurity Setting

2011年11月16日 星期三

SQL Server 與系統啟動參數設定


        繼上一篇的文章後,相信大家對記憶體有進一步的了解,但是後來在工作上,發現還是有許多的使用者在 x86 的架構下忘記了設定系統的啟動參數,導致記憶體還是無法有效的利用,所以我透過這一篇來告訴大家如何進行。

相關文章:SQL Server - x86與x64的架構下 - 最佳記憶體設定

        在 XP 與 Windows 2003的年代你可以透過根目錄下的 boot.ini 的系統啟動檔來設定,但是到了 Windows 2008以後,為了系統的安全性,所以需透過 Boot Configuration Data Editor 的工具來設定啟動檔,工具名稱簡稱 bcdedit.exe,設定上請確認自已機器上的記憶體有多少,然後根據下表的說明進行。

系統啟動檔設定
實體記憶體是否啟用 /3GB是否啟用 /PAE
3-4GYesNo
4-8GYesYes
16G以上NoYes

        假設我的主機上有8G的實體記憶體,所以根據上表,需要開啟 /3GB 與 /PAE的設定,設定方式如下:

1、開啟一個 DOS Command視窗,輸入下列的語法查詢目前是否已有啟用PAE與3GB的參數:
bcdedit /enum osloader


如果 PAE有啟用時,會秀出 pae ForceEnable
如果 PAE有啟用時,會秀出 increaseuserva 3072
(如下圖所示)

PS:如果執行 bcdedit 發生下列的錯誤訊息時,請依照下列的作法排除

錯誤訊息:
無法開啟開機設定資料存放區。
存取被拒。


排除方式:
請點選 [開始] -> [所有程式] -> [附屬應用程式] -> [命令提示字元] 然後按滑鼠右鍵點選 [以系統管理員身份執行]

2、加入 /PAE 的參數,請輸入下列指令
bcdedit /set pae forceenable

3、加入 /3GB 的參數,請輸入下列指令
bcdedit /set increaseuserva 3072

4、輸入完成後,再透過第一步驟的指令確認是否有完成,然後再重開機即可。


最後下列是 OS 與 SQL Server 各個版本的記憶體支援的清單,再請參考。
Windows 2008 與 Windows 2008R2 記憶體支援
版本最大記憶體限制 (x86)最大記憶體限制 (x64)
Windows Server 2008
Datacenter
64GB2TB
Windows Server 2008
Enterprise
64GB2TB
Windows Server 2008
Standard
4GB32GB
Windows Small Business Server 20084GB32GB
Windows Web Server 20084GB32GB

SQL Server 2008 與 SQL Server 2008R2 記憶體與CPU支援
SQL Server 版本最大記憶體支援最大CPU數支援
DatacenterOperating system maximumOperating system maximum
Enterprise2 TB8
DeveloperOperating system maximumOperating system maximum
Standard64 GB4
Web64 GB4
Workgroup4 GB (64-bit), OS maximum (32-bit)2
Express1 GB1
Express with Tools1 GB1
Express with Advanced Services1 GB 
4 GB for Reporting Services
1


參考連結:
Boot Configuration Data Editor Frequently Asked Questions
BCDEdit /set

相關文章:SQL Server - x86與x64的架構下 - 最佳記憶體設定

關鍵字:SQL ServerMemoryMemory Limit、Memory Setting、BCDEDIT

2011年11月13日 星期日

.net 程式進階除錯教學 - 使用WinDbg

        從以前一直研究基金方面的資訊,但由於沒有多於的時間常常觀看,再加上碩士時在我們老師的指導下,我將基金的資訊透過 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


關鍵字:C#.NetWinDbgHang DumpDump File