如何手工抓取dump文件及分析

在生產環境下進行故障診斷時,為了不終止正在運行的服務或應用程序,有兩種方式可以對正在運行的服務或應用程序的進程進行分析和調試。

首先一種比較直觀簡潔的方式就是用WinDbg等調試器直接attach到需要調試的進程,調試完畢之后再detach即可。但是這種方式有個缺點就是執行debugger命令時必須先break這個進程,執行完debug命令之后又得趕緊F5讓他繼續運行,因為被你break住的時候意味著整個進程也已經被你掛起。另外也經常會由于First Chance Excetpion而自動break,你得時刻留意避免長時間break整個進程。所以這樣的調試方式對時間是個很大的考驗,往往沒有充裕的時間來做仔細分析。

另一種方式則是在出現問題的時候,比如CPU持續長時間100%,內存突然暴漲等非正常情況下,通過對服務進程snapshot抓取一個dump文件,完成dump之后先deatch,讓進程繼續運行。然后用windbg等工具來分析這個抓取到的dump文件。

那么如何在不終止進程的情況下抓取dump文件呢?Debugging Tools for Windows里提供了一個非常好的工具,adplus.vbs。從名字可以看出,實際上是一個vb腳本,只是對cdb調試器作的一個包裝腳本。

其路徑與Debugging Tools for Windows的安裝路徑相同,使用的方法也很簡單,如下所示:

adplus.vbs -hang -p 1234 -o d:\dump

其中-hang指明使用hang模式,亦即在進程運行過程中附加上去snapshot抓取一個dump文件,完成之后detach。與之對應的是-crash崩潰模式,用戶先啟動adplus,然后由它啟動要監控的程序,在出現異常崩潰時自動生成dump文件,或者通過Ctrl-C人為發出抓取指令。但是-crash模式在抓取完成之后,被監控的進程就必須終止。因此我們在這里只選用-hang模式。

-p是要調試的進程ID,比如ASP.NET應用線程池,在Win2003下就是w3wp.exe

-o 指定要output的dump文件路徑。

另外,與adplus類似的,有個UserDump工具,但是抓取用戶模式的進程,而adplus則是內核模式和用戶模式兩者皆可。

而總所周至的Dr. Waston,則會在進程崩潰之后的自動時候抓取dump文件,一樣可以用于windbg等調試器來事后分析程序崩潰時的狀態。

====================
0:000> !dumpheap -stat?
No export dumpheap found?
======解決方法:
.load clr20\sos.dll,你要先執行的。sos.dll在默認的c:\windows\microsoft.net\framework\v2.....下面,你復制到c:\program files\debugging tools for windows下面的clr20目錄下面(clr20是你手工創建的)?
?=======================
?????
? 在.NET下開發時,最基本的調試方法就是使用Visual Studio的單步調試。但是對于一些特殊情況,特別是涉及到CLR內部的時候使用這種方式就達不到目的了。?
? 如果要查看運行時內存使用情況,IL代碼,CLR信息等可以使用以下兩種方式:?
? 1、使用VS2005 + sos.dll?
? 2、使用Windbg + sos.dll?
? 第二種方式功能更加強大,下面我就通過實際操作展示一下怎么使用這種方法得到運行時ArrayList內部的值。?
? 有人可能會說:我直接用Visual Studio的單步調試豈不是更快?當然,這個只是一個演示,通過這個演示是為以后的高級調試打下基礎?
???
? 在操作之前,先熟悉一下基本知識:?
? A、使用VS2005 + sos.dll調試?
? 1、需要在項目->屬性->調試-〉啟用非托管代碼調試?
? 2、打開調試-〉窗口-〉即時?
? 3、在即時窗口中輸入 !load sos 加載調試模塊?
? 4、輸入其它調試語句?
???
? B、使用Windbg + sos.dll?
? 1、去微軟的網站下載最新的Windbg?
? 2、打開Windbg在File-〉Symbol File Path ...窗口中輸入 srv*c:\symbols*http://msdl.microsoft.com/download/symbols?
? 3、運行需要調試的程序,然后在Windbg中File-〉Attach to Process中選擇剛才運行的程序?
? 4、在出現的Command窗口中就可以輸入調試語句?
? 5、常用調試語句:?
?? lm //查看加載了哪些模塊?
?? .load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll //加載調試模塊?
?? ld TestClass //加載調試符號?
?? !name2ee TestClass.exe TestClass.Program.test //顯示test方法相關的地址?
?? !dumpmt -md 00976d48 //得到類的成員函數詳細信息?
?? !dumpil 00973028 // 顯示這個方法被編譯器編譯之后的IL代碼?
?? !dumpheap -stat //該命令顯示程序中所有對象的統計信息,顯示的大小是對象本身的大小,不包括對象里面值的大小?
?? !dumpheap -mt 790fcb30 //該命令顯示MethodTable 790fcb30的詳細信息?
?? !gcroot 012919b8 //來顯示一個實例的所屬關系?
?? !dumpobj(do) 012a3904 //顯示一個對象的具體內容,看對象里面有什么,值是什么?
?? !ObjSize 012a1ba4 //對象實際在內存中的大小?
?? !eeheap -gc //查看托管堆的情況(包括大小)?
?? !DumpArray //查看數組信息?
?? 下面就來看看具體的調試步驟:?
? 1、我們的測試代碼?
???
???
? namespace TestClass?
? {?
?? class Program?
?? {?
?? [STAThread]?
?? static void Main(string[] args)?
?? {?
?? ArrayList list = new ArrayList();?
?? list.Add("aaaa");?
?? list.Add("bbbb");?
?? Console.ReadLine();?
?? }?
?? }?
? }很簡單,就是一個ArrayList?
???
? 運行這個程序(開始執行,不調試),然后進入Windbg,Attach到這個進程?
???
? 2、查看所有堆棧信息?
? 0:004> !dumpheap -stat?
?? MT Count TotalSize Class Name?
? 7910062c 1 12 System.Security.Permissions.SecurityPermission?
? 7918e284 1 16 System.IO.TextReader+SyncTextReader?
? 79102d10 1 20 Microsoft.Win32.SafeHandles.SafeFileMappingHandle?
? 79102cb4 1 20 Microsoft.Win32.SafeHandles.SafeViewOfFileHandle?
? 79101d30 1 20 System.Text.InternalEncoderBestFitFallback?
? 79100a7c 1 20 Microsoft.Win32.SafeHandles.SafeFileHandle?
? 79105cd4 1 24 System.Collections.ArrayList?
? ......?
? 7912ad90 11 9036 System.Object[]?
? 790fcb30 2083 131492 System.String?
? Total 2202 objects?
? 除了我們的ArrayList外,還有很多其它的系統信息,先不用管它?
???
? 3、查看我們的ArrayList的信息?
? 0:004> !dumpheap -mt 79105cd4?
?? Address MT Size?
? 012a1b88 79105cd4 24?
? total 1 objects?
? Statistics:?
?? MT Count TotalSize Class Name?
? 79105cd4 1 24 System.Collections.ArrayList?
? Total 1 objects?
???
? 4、查看對應地址內部實際的值?
? 0:004> !do 012a1b88?
? Name: System.Collections.ArrayList?
? MethodTable: 79105cd4?
? EEClass: 79105c28?
? Size: 24(0x18) bytes?
?? (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)?
? Fields:?
?? MT Field Offset Type VT Attr Value Name?
? 7912ad90 40008df 4 System.Object[] 0 instance 012a1bb0 _items?
? 791018e0 40008e0 c System.Int32 1 instance 2 _size?
? 791018e0 40008e1 10 System.Int32 1 instance 2 _version?
? 790fc35c 40008e2 8 System.Object 0 instance 00000000 _syncRoot?
? 7912ad90 40008e3 1c0 System.Object[] 0 shared static emptyArray?
?? >> Domain:Value 00149c58:012a1ba0 <<?
? 可以看到ArrayList的大小為2,具體的值保存在地址012a1bb0中,是一個System.Object[]類型的數組?
???
? 5、查看數組信息?
? 0:004> !DumpArray 012a1bb0?
? Name: System.Object[]?
? MethodTable: 7912ad90?
? EEClass: 7912b304?
? Size: 32(0x20) bytes?
? Array: Rank 1, Number of elements 4, Type CLASS?
? Element Methodtable: 790fc35c?
? [0] 012a1b50?
? [1] 012a1b6c?
? [2] null?
? [3] null?
???
? 6、查看數組內對象的值?
? 0:004> !do 012a1b50?
? Name: System.String?
? MethodTable: 790fcb30?
? EEClass: 790fca90?
? Size: 26(0x1a) bytes?
?? (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)?
? String: aaaa?
? Fields:?
?? MT Field Offset Type VT Attr Value Name?
? 791018e0 4000096 4 System.Int32 1 instance 5 m_arrayLength?
? 791018e0 4000097 8 System.Int32 1 instance 4 m_stringLength?
? 790fe534 4000098 c System.Char 1 instance 61 m_firstChar?
? 790fcb30 4000099 10 System.String 0 shared static Empty?
?? >> Domain:Value 00149c58:790d81bc <<?
? 7912b1d8 400009a 14 System.Char[] 0 shared static WhitespaceChars?
?? >> Domain:Value 00149c58:012a16f0 <<??
====================

windbg使用小總結
【抓dump】
1、一般抓法
adplus -hang -p 3230 -quiet 抓3230 pid進程,hang模式,相當于把那個進程暫停住,取內存快照
adplus -crash -pn w3wp -quiet 抓w3wp進程,crash模式,當那個進程崩潰結束的時候自動抓取當時的內存
adplus -hang -iis -quiet 抓IIS相關進程,包括其上host的web應用,以及iis自身
2、抓window服務
http://support.microsoft.com/kb/824344/zh-cn
3、遠程抓
http://blog.joycode.com/tingwang/archive/2006/08/11/79763.aspx
4、抓藍屏和死機的dump
電腦無故重啟或者藍屏會在C:\WINDOWS\Minidump\下保存一個minidump,但是這個minidump可用的命令很少,一般只打!analyze –v看到是哪個進程引起的,還有相關的驅動模塊就基本定位問題了。
5、IIS回收的時候抓
http://blog.yesky.com/blog/omakey/archive/2006/12/17/1618015.html
6、計劃任務抓
比如一個進程起來后不知道它什么時候會意外崩潰,可以在計劃任務里用crash里抓,當那個進程意外終止的時候,cdb可以直接附加上去,抓取當時的dump,如果要抓一些會自動重啟的進程,而且要抓每次重啟前的dump,可以參考附錄里一節。

【常用命令】
1、先path C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727,把.net路徑設置為path環境變量,一遍在windbg里可以直接.load sos,而不必.load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll
2、ld demo,加載你程序的pdb文件,調試.net程序一般要把kernel32和mscorwks的符號加載上,關于這兩個東西大家可以查資料,尤其是后者有哪些函數可以多了解一些。
3、在windbg的file/symbol file path對話框里輸入以下文字,以便自動加載和下載符號
C:\WINDOWS\Symbols;d:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\symbols;.sympath SRV*d:\localsymbols*http://msdl.microsoft.com/download/symbols
其中有windows、.net2.0和自動從網上下載的調試符號,注意根據自己的情況適當修改目錄

【調試死鎖】
1、!syncblk,查看哪些線程拿到了鎖
2、~67e!clrstack 跳到某個拿到鎖的線程看它正在干什么操作,遲遲不肯釋放鎖
3、!runaway 查看這個占有鎖的線程運行了多長時間。
4、~*e!clrstack查看所有線程的托管堆棧,看看哪些是正在等待鎖的,比如hang在System.Threading.Monitor.Enter(System.Object)?
5、~136s選擇該線程,顯示如下
0:000> ~136s eax=00005763 ebx=08deeb5c ecx=03eff0d4 edx=5570ab69 esi=08deeb5c edi=7ffd6000 eip=7c95ed54 esp=08deeb10 ebp=08deebb8 iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 ntdll!KiFastSystemCallRet: 7c95ed54 c3 ret
找到ecx寄存器的值,復制后ctrl+f,向上查找,會找到!syncblk的地方,如下
0:000> !syncblk Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 1906 03ee4be4 5 1 03ee8f88 22c8 67 185e2ef0 System.Object 5390 052ca39c 3 1 05292b30 1dd4 49 1060d3ac System.Object 9372 0530702c 15 1 0012d3a8 1aa8 80 185e7704 System.Object 11428 03eff0d4 35 1 053b8fa8 169c 120 166acd98 System.Object 15278 0531c6b4 61 1 06bc1430 26d8 86 1a5bea88 System.Object
可以看到136線程等待的鎖被120號線程占著不放(格式有點亂,湊合看),
6、有時候通過ecx寄存器找鎖不是很確定,可以用~* kb來把所有線程堆棧打出來,然后根據!syncblk出來的同步快的值去搜索大概有多少個線程在等那個鎖。因為同樣是等待鎖,可等的狀態不一樣,有的在Q里,有的鎖已經升級,有的去嘗試去拿鎖了,所以不一定當時ecx寄存器指向那塊內存,具體如何找到某個正在等待鎖的線程等待的鎖的內存地址,以及它正等待的這個鎖被哪個線程拿著,我還沒琢磨出規律來,但一般情況下,如果有其它同步對象的話,更難查。.net里用我上面說的幾步就能查出鎖的問題了。


【內存泄漏】
1、!dumpheap -stat看看哪些對象個數最多,占內存最大,
2、找到某個格式比較多的對象,可以看它的方法表,然后用!dumpheap -mt 66398fa4去隨機找幾個對象的地址
3、用!do 1e5a22bc命令去查看幾個對象的狀態,屬性的值等,看看正常不正常
4、用!gcroot -nostacks 1e5a22bc去查看幾個對象的根正常不正常,如果有些對象的根不是自己預先設計的那樣,很可能被自己沒想到的對象強引用了,所以GC無法回收它,就泄漏了。
【CPU百分百】
主要用幾個計數器和!runaway命令,具體見以下鏈接
http://www.cnblogs.com/onlytianc?... 7/06/03/769307.html
【線程池耗盡】
!threadpool 能看到完成端口,線程池工作線程和timer回調各占線程池的情況。
【其它】
1、!eestack -short -ee查看所有重要(獲取鎖的,托管的,停止并允許回收的)線程的dumpstack,差不多相當于~*e!dumpstack
2、.time 可以看到進程跑了多少時間
3、!dso 查看當前線程里有哪些對象,分析內存泄漏問題也許會用到
【小結】
要想很好的用windbg排查.net問題,首先要了解一些clr宿主的基礎知識,以及IL的一些基礎,還有簡單的寄存器和匯編嘗試,再就是有個好的思路,最后就是經驗和對代碼邏輯的理解。


【附錄:寫了一個自動抓dump的工具,可在程序異常退出的時候抓dump】
【使用方法】
1、先在cmd下運行以下命令確保計劃任務開著
net start "task scheduler"
2、執行以下命令安排自動抓包
at 13:27 d:\myapp\autodump\processmon.exe
其中計劃啟動的時間和自動抓包的程序路徑要根據情況設置,計劃啟動之前當前用戶一定要注銷。
【相關配置】
<appSettings>
? <add key="adplusPath" value="D:\MyApp\Debugging\adplus.vbs"/><!--adplus的路徑-->
? <add key="ProcessName" value="w3wp"/><!--要抓dump的進程的名字,可用部分名字,不用完整的-->
</appSettings>


【源碼】


[csharp]?view plain?copy
?在CODE上查看代碼片派生到我的代碼片
  1. using?System;??
  2. using?System.Collections.Generic;??
  3. using?System.Diagnostics;??
  4. using?System.Threading;??
  5. ??
  6. namespace?ProcessMon??
  7. {??
  8. ????class?Program??
  9. ????{??
  10. ????????static?readonly?List<int>?_dumpPIDs?=?new?List<int>();??
  11. ????????private?static?readonly?string?_processName?=?System.Configuration.ConfigurationManager.AppSettings["ProcessName"];??
  12. ????????private?static?readonly?string?_adplusPath?=?System.Configuration.ConfigurationManager.AppSettings["adplusPath"];??
  13. ????????static?void?Main(string[]?args)??
  14. ????????{??
  15. ????????????while(true)??
  16. ????????????{??
  17. ????????????????Console.WriteLine("..");??
  18. ????????????????ThreadProc();??
  19. ????????????????Thread.Sleep(10000);??
  20. ????????????}??
  21. ????????}??
  22. ??
  23. ????????private?static?void?ThreadProc()??
  24. ????????{??
  25. ????????????foreach(Process?vProcess?in?Process.GetProcesses())??
  26. ????????????{??
  27. ????????????????try??
  28. ????????????????{????????????????
  29. ????????????????????string??processName??=??vProcess.ProcessName.ToLower();??
  30. ????????????????????if?(processName.IndexOf(_processName)?>=?0)??
  31. ????????????????????{??
  32. ????????????????????????Console.WriteLine("{0}-{1}",?vProcess.ProcessName,?vProcess.Id);??
  33. ??
  34. ????????????????????????if?(_dumpPIDs.Contains(vProcess.Id))??
  35. ????????????????????????????continue;??
  36. ????????????????????????_dumpPIDs.Add(vProcess.Id);??
  37. ????????
  38. ????????????????????????DumpProcessDeg?d?=?DumpProcess;??
  39. ????????????????????????d.BeginInvoke(vProcess.Id,?null,?null);??
  40. ????????????????????????DumpProcess(vProcess.Id);??
  41. ????????????????????}??
  42. ????????????????}??
  43. ????????????????catch(Exception?ex)??
  44. ????????????????{??
  45. ????????????????????Console.WriteLine(ex);??
  46. ????????????????}??
  47. ????????????}??
  48. ????????}??
  49. ??
  50. ????????private?delegate?void?DumpProcessDeg(int?pid);??
  51. ????????static??void??DumpProcess(int?pid)??
  52. ????????{??
  53. ????????????ProcessStartInfo??Info??=??new??System.Diagnostics.ProcessStartInfo();??
  54. ????????????Info.FileName?=?_adplusPath;??
  55. ????????????Info.Arguments?=?string.Format("-crash?-p?{0}?-quiet",pid);??
  56. ????????????Info.WorkingDirectory??=??"C:\\";??
  57. ????????????Process??Proc??;??
  58. ????????????try??
  59. ????????????{??
  60. ????????????????Proc??=??Process.Start(Info);??
  61. ????????????}??
  62. ????????????catch(System.ComponentModel.Win32Exception??e)??
  63. ????????????{??
  64. ????????????????Console.WriteLine("系統找不到指定的程序文件。\r{0}",??e);??
  65. ????????????????return;??
  66. ????????????}??
  67. ????????????Proc.EnableRaisingEvents?=?true;??
  68. ????????????Console.WriteLine("外部程序的開始執行時間:{0}",??Proc.StartTime);??
  69. ????????????Proc.WaitForExit(60000);??
  70. ????????????if(Proc.HasExited??==??false){??
  71. ????????????????Console.WriteLine("由主程序強行終止外部程序的運行!");??
  72. ????????????????Proc.Kill();??
  73. ????????????}??
  74. ????????????else{??
  75. ????????????????Console.WriteLine("由外部程序正常退出!");??
  76. ????????????}??
  77. ????????????Console.WriteLine("外部程序的結束運行時間:{0}",??Proc.ExitTime);??
  78. ????????????Console.WriteLine("外部程序在結束運行時的返回值:{0}",??Proc.ExitCode);??
  79. ????????}??
  80. ????}??
  81. }??


===============
補充幾個命令:

1、!analyze -v :用于分析掛掉線程的詳細情形,錯誤原因。

2、!locks :列出全部資源使用情況。

3、!locks -v 0x???????? :特定地址的死鎖分析。

4、!thread 0x????????:特定線程詳情。

5、.thread 0x????????:轉到某個線程堆棧。
?


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/b2b160/archive/2009/03/03/3951782.aspx

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

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

相關文章

Java 類加載機制詳解

2019獨角獸企業重金招聘Python工程師標準>>> 一、類加載器 類加載器&#xff08;ClassLoader&#xff09;&#xff0c;顧名思義&#xff0c;即加載類的東西。在我們使用一個類之前&#xff0c;JVM需要先將該類的字節碼文件&#xff08;.class文件&#xff09;從磁盤…

JAVA vo pojo javabean dto區別

JavaBean 是一種JAVA語言寫成的可重用組件。為寫成JavaBean&#xff0c;類必須是具體的和公共的&#xff0c;并且具有無參數的構造器。JavaBean 通過提供符合一致性設計模式的公共方法將內部域暴露成員屬性。眾所周知&#xff0c;屬性名稱符合這種模式&#xff0c;其他Java 類可…

編寫的windows程序,崩潰時產生crash dump文件的辦法

一、引言 dump文件是C程序發生異常時&#xff0c;保存當時程序運行狀態的文件&#xff0c;是調試異常程序重要的方法&#xff0c;所以程序崩潰時&#xff0c;除了日志文件&#xff0c;dump文件便成了我們查找錯誤的最后一根救命的稻草。windows程序產生dump文件和linux程序產生…

Nginx+PHP實時生成不同尺寸圖片

原來圖片服務器采用Windows .net架構&#xff0c;鑒于需求需要生成各種尺寸圖片。流程說明:用戶從Nginx請求對應的圖片,判斷是否存在_200x300的對應參數&#xff0c;如果沒有就直接請求到對應目錄的原圖&#xff0c;否則繼續判斷是否在本地已經生成了對應的緩存圖片&#xff0c…

JavaScript設計模式 Item 2 -- 接口的實現

1、接口概述 1。什么是接口&#xff1f; 接口是提供了一種用以說明一個對象應該具有哪些方法的手段。盡管它可以表明這些方法的語義&#xff0c;但它并不規定這些方法應該如何實現。 2. 接口之利 促進代碼的重用。 接口可以告訴程序員一個類實現了哪些方法&#xff0c;從而幫助…

Spring Boot 樂觀鎖加鎖失敗 - 集成AOP

Spring Boot with AOP 手頭上的項目使用了Spring Boot&#xff0c; 在高并發的情況下&#xff0c;經常出現樂觀鎖加鎖失敗的情況&#xff08;OptimisticLockingFailureException&#xff0c;同一時間有多個線程在更新同一條數據&#xff09;。為了減少直接向服務使用者直接返回…

掌握VS2010調試 -- 入門指南

1 導言 在軟件開發周期中&#xff0c;測試和修正缺陷&#xff08;defect&#xff0c;defect與bug的區別&#xff1a;Bug是缺陷的一種表現形式&#xff0c;而一個缺陷是可以引起多種Bug的&#xff09;的時間遠多于寫代碼的時間。通常&#xff0c;debug是指發現缺陷并改正的過程。…

151031

create or replace procedure pr_test1 is v_case number(3): 100; beginif 2>1 thendbms_output.put_line(成立);elsif 4>3 thenif 7>6 thendbms_output.put_line(不成立);end if; elsif 6>5 thendbms_output.put_line(也行);elsedbms_output.put_line(也不成立);…

postgresql9.5 run 文件linux安裝后配置成開機服務

網上出現的比較多安裝方法要么是源碼安裝&#xff0c;要么是yum安裝&#xff0c;我發覺都要配置很多屬性&#xff0c;比較麻煩&#xff0c;所以現在我在centos7長用 run文件來安裝 http://get.enterprisedb.com/postgresql/postgresql-9.5.1-1-linux-x64.run 這里的安裝shell整…

Windows API GetProcAddress 及demo code

GetProcAddress函數檢索指定的動態鏈接庫(DLL)中的輸出庫函數地址。 函數原型&#xff1a; FARPROC GetProcAddress( HMODULE hModule, // DLL模塊句柄 LPCSTR lpProcName// 函數名 ); 參數&#xff1a; hModule [in] 包含此函數的DLL模塊的句柄。LoadLibrary、AfxLoadLibrary …

【操作系統】進程管理

進程管理 進程的基本概念 程序的順序執行及其特征 程序的順序執行:僅當前一操作(程序段)執行完后&#xff0c;才能執行后續操作。 程序順序執行時的特征&#xff1a;順序性&#xff0c;封閉性&#xff0c;可再見性。 前趨圖 前趨圖(Precedence Graph)是一個有向無循環圖&#…

va_list va_start va_end的使用

<pre name"code" class"cpp" style"color: rgb(51, 51, 51); white-space: pre-wrap; word-wrap: break-word;"><strong>一、 從printf()開始</strong> 從大家都很熟悉的格式化字符串函數開始介紹可變參數函數。 原型&#xf…

Linux學習之CentOS(三)----將Cent0S 7的網卡名稱eno16777736改為eth0

【正文】 Linux系統版本&#xff1a;CentOS_7&#xff08;64位&#xff09; 一、前言&#xff1a; 今天又從Centos 6.5裝回了Centos 7&#xff0c;畢竟還是要順應潮流嘛。安裝完成之后&#xff0c;發現發現CentOS 7默認的網卡名稱是eno16777736&#xff0c;如圖所示&#xff1a…

本地音頻播放,使用AVFoundation.framework中的AVAudioPlayer來實現

本地音頻播放,使用AVfoundation.framework中的AVAudioPlayer來實現 /*AVAudioPlayer的使用比較簡單: 1、初始化AVAudioPlayer對象&#xff0c;此時通常指定本地文件路徑 2、設置播放器屬性&#xff0c;例如重復次數、音量大小等 3、調用play方法播放。 */

AngularJS操作DOM——angular.element

addClass()-為每個匹配的元素添加指定的樣式類名after()-在匹配元素集合中的每個元素后面插入參數所指定的內容&#xff0c;作為其兄弟節點append()-在每個匹配元素里面的末尾處插入參數內容attr() - 獲取匹配的元素集合中的第一個元素的屬性的值bind() - 為一個元素綁定一個事…

C++中operator的主要用法

1&#xff0e; operator 用于類型轉換函數&#xff1a; 類型轉換函數的特征&#xff1a; 1&#xff09; 型轉換函數定義在源類中&#xff1b; 2&#xff09; 須由 operator 修飾&#xff0c;函數名稱是目標類型名或目標類名&#xff1b; 3&#xff09; 函數沒有參數&#x…

聲紋識別

一、 聲紋識別是一項根據語音波形中反映說話人生理和行為特征的語音參數&#xff0c;自動識別說話人身份的技術。與語音識別不同的是&#xff0c;聲紋識別利用的是語音信號中的說話人身份信息&#xff0c;而不考慮語音中的字詞意思。由于每個人的生物特征具有與其他人不同的唯一…

Asp.net mvc 實時生成縮率圖到硬盤

之前對于縮率圖的處理是在圖片上傳到服務器之后&#xff0c;同步生成兩張不同尺寸的縮率供前端調用&#xff0c;剛開始還能滿足需求&#xff0c;慢慢的隨著前端展示的多樣化&#xff0c;縮率圖已不能前端展示的需求&#xff0c;所以考慮做一個實時生成圖片縮率圖服務。 每次調用…

數據庫事務的隔離機制

數據庫事務(Database Transaction) &#xff0c;是指作為單個邏輯工作單元執行的一系列操作&#xff0c;要么完全地執行&#xff0c;要么完全地不執行。----百度百科就是說你定義一組數據庫操作&#xff0c;然后告訴數據庫說這些操作要么都成功&#xff0c;要么都不成功。類似于…

如何使用CppUnit進行單元測試

http://www.vckbase.com/document/viewdoc/?id1762 一、前言 測試驅動開發(TDD)是以測試作為開發過程的中心&#xff0c;它堅持&#xff0c;在編寫實際代碼之前&#xff0c;先寫好基于產品代碼的測試代碼。開發過程的目標就是首先使測試能夠通過&#xff0c;然后再優化設計結構…