{"id":8679,"date":"2011-01-27T22:50:00","date_gmt":"2011-01-27T20:50:00","guid":{"rendered":"https:\/\/fatihboy.com\/post\/win32-debugger-yapiyoruz%e2%80%932"},"modified":"2021-06-19T10:09:31","modified_gmt":"2021-06-19T07:09:31","slug":"win32-debugger-yapiyoruz-2","status":"publish","type":"post","link":"https:\/\/fatihboy.com\/en\/win32-debugger-yapiyoruz-2\/","title":{"rendered":"Win32 Debugger Yap\u0131yoruz \u2013 2"},"content":{"rendered":"<p>&nbsp;&nbsp;&nbsp; <a href=\"\/en\/win32-debugger-yapiyoruz-1\/\">\u00d6nceki makalemde<\/a> sizlerle birlikte Windows debug API&#8217;lerini tan\u0131m\u0131\u015f ve bu API&#8217;leri bir C# uygulamas\u0131 i\u00e7erisinden nas\u0131l eri\u015febilece\u011fimizi g\u00f6rm\u00fc\u015ft\u00fck. Makalemin sonuna geldi\u011fimizde ise en basit haliyle bir debug uygulamas\u0131 olu\u015fturabilmi\u015f, \u00e7al\u0131\u015fan bir uygulamaya ba\u011flanabilmi\u015f ya da debug moduyla yeni bir i\u015flem ba\u015flatabilmi\u015ftik. Bir debugger&#8217;\u0131n en temel bile\u015feni olan debug d\u00f6ng\u00fcs\u00fcn\u00fcn nas\u0131l oldu\u011funu g\u00f6rerek basit bir debug d\u00f6ng\u00fcs\u00fc yapm\u0131\u015ft\u0131k. Bu makalemde, ba\u011flan\u0131lan uygulama i\u00e7erisinden g\u00f6nderilen debug mesajlar\u0131n\u0131 ve y\u00fcklenen\/kald\u0131r\u0131lan dll isimlerini nas\u0131l bulabilece\u011fimizi, hata olay bildirimlerinde hatan\u0131n seviyesini nas\u0131l bulabilece\u011fimizi sizlerle payla\u015f\u0131yor olaca\u011f\u0131m.<\/p>\n\n\n\n<p>&nbsp;&nbsp; \u00d6nceki makalem ve bu makalemdeki payla\u015ft\u0131\u011f\u0131m konular\u0131n peki\u015fmesi a\u00e7\u0131s\u0131ndan \u00f6rnek bir uygulama \u00fczerinden gidiyor olaca\u011f\u0131m;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/Debugger.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/Debugger_thumb.png\" alt=\"\u00d6rnek Debugger uygulamas\u0131ndan bir ekran g\u00f6r\u00fcnt\u00fcs\u00fc\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde de g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi \u00f6rnek uygulamam\u0131z basit d\u00fczeyde bir debugger. \u00dcst b\u00f6l\u00fcmde \u00e7al\u0131\u015fan i\u015flemler listelenmekte ve kullan\u0131c\u0131 se\u00e7ti\u011fi bir i\u015fleme &#8220;Se\u00e7ili \u0130\u015flemi Debug Et&#8221; butonu vas\u0131tas\u0131yla hata ay\u0131klama amac\u0131yla ba\u011flanabilmekte. Hata ay\u0131klama amac\u0131yla bir i\u015flem ba\u015flat\u0131lmak istenirse, ekranda yer alan &#8220;Debug Oturumu Ba\u015flat&#8221; butonuna bas\u0131larak gelen diyalogda ilgili exe se\u00e7ilebilmekte. Hata ay\u0131klama s\u00fcrecinde i\u015flemden gelen mesajlar ekran\u0131n alt taraf\u0131nda yer alan &#8220;\u0130\u015flem Hareketleri&#8221; b\u00f6l\u00fcm\u00fcnde g\u00f6sterilecektir. Uygulamam\u0131z Win32 debug API&#8217;lerini kullanmas\u0131 nedeniyle .Net uygulamalar\u0131n\u0131 debug etmeye tam olarak elveri\u015fli olmasa da hatal\u0131 durumlarda bekleme, debug mesaj\u0131n\u0131 alma gibi baz\u0131 temel i\u015flevleri .Net uygulamalar\u0131nda da kullan\u0131labilmekte.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/CRMUygulamasi1.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/CRMUygulamasi_thumb1.png\" alt=\"Debugger\u0131 test edebilece\u011finiz \u00f6rnek CRM uygulamas\u0131ndan bir ekran g\u00f6r\u00fcnt\u00fcs\u00fc\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; \u00d6rnek debugger uygulamam\u0131z ile birlikte, testlerde kullan\u0131lmak \u00fczere, olduk\u00e7a basit ve herhangi bir i\u015f mant\u0131\u011f\u0131 bulunmayan bir CRM uygulamas\u0131 bulabilirsiniz. Hata ay\u0131klama konusundaki \u00f6nceki makalelerimi takip edenlerinizin a\u015fina olaca\u011f\u0131 bu CRM uygulamas\u0131 hata yakalamay\u0131 test edilebilmesi ad\u0131na bir hata bar\u0131nd\u0131rmaktad\u0131r. Uygulama a\u00e7\u0131ld\u0131\u011f\u0131nda gelen ekranda herhangi bir de\u011fer girmeden kaydet butonuna bas\u0131ld\u0131\u011f\u0131nda uygulamada hata olu\u015facakt\u0131r. \u00d6rnek bir debug mesaj\u0131n\u0131 debugger\u0131m\u0131zda g\u00f6rebilmek amac\u0131yla bu \u00f6rnek CRM uygulamas\u0131 kay\u0131t i\u015flemine ba\u015flamadan \u00f6nce a\u015fa\u011f\u0131daki sat\u0131rla bir debug mesaj\u0131 vermektedir;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Debug.WriteLine(\"M\u00fc\u015fteri kay\u0131t i\u015flemi ba\u015flat\u0131l\u0131yor\");<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; \u0130sterseniz debugger\u0131m\u0131zla \u00f6ncelikle CRM uygulamas\u0131nca g\u00f6nderilen bu debug mesaj\u0131n\u0131 nas\u0131l g\u00f6sterebilece\u011fimizi g\u00f6relim. Pek \u00e7ok uygulama debugger&#8217;a mesaj g\u00f6nderebilmek i\u00e7in Kernel32.dll i\u00e7erisinde yer alan <strong>OutputDebugString<\/strong>&nbsp; Win32 API fonksiyonunu kullanmaktad\u0131r. .Net ailesi de buna bir istisna olmay\u0131p mesajlar\u0131n g\u00f6nderimi s\u0131ras\u0131nda ayn\u0131 fonksiyonu kullanmaktad\u0131r. Dolay\u0131s\u0131yla native uygulamalarda oldu\u011fu gibi managed CRM uygulamam\u0131zdan g\u00f6nderece\u011fimiz debug mesaj\u0131n\u0131 da yakalayabilmemiz m\u00fcmk\u00fcn. \u0130\u015fletim sistemi hata ay\u0131klamak i\u00e7in takip edilen bir uygulama bu fonksiyonu kullanarak debug mesaj\u0131 g\u00f6nderdi\u011finden bu durumu debugger&#8217;a <strong>OUTPUT_DEBUG_STRING_EVENT<\/strong> olay\u0131n\u0131 bildirerek ilgili olaya ait verileri <strong>OUTPUT_DEBUG_STRING_INFO<\/strong> struct&#8217;\u0131yla payla\u015f\u0131yor olacakt\u0131r. MSDN web sitesinden detayl\u0131 <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms680545(v=VS.85).aspx\" target=\"_blank\" rel=\"noopener noreferrer\">dok\u00fcmantasyonu<\/a>nu bulabilece\u011finiz struct&#8217;\u0131n\u0131 C# i\u00e7erisinde a\u015fa\u011f\u0131daki yap\u0131yla kullanabiliyor oluruz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[StructLayout(LayoutKind.Sequential)]\npublic struct OUTPUT_DEBUG_STRING_INFO {\n    public IntPtr lpDebugStringData;\n    public UInt16 fUnicode;\n    public UInt16 nDebugStringLength;\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Pek\u00e7o\u011funuzun bekledi\u011finin aksine yukar\u0131da da g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi debug mesaj\u0131 alt\u0131n bir tepsi ile bize sunulmamakta, ula\u015fmak i\u00e7in biraz \u00e7aba sarf etmemiz gerekli \ud83d\ude42 Olay bildirimi sonras\u0131nda elimizde \u015fu \u00fc\u00e7 bilgi olacakt\u0131r; debug mesaj\u0131n\u0131n bulundu\u011fu haf\u0131za adresi, unicode olup olmad\u0131\u011f\u0131 ve debug mesaj\u0131n\u0131n uzunlu\u011fu. Benim gibi C++ ge\u00e7mi\u015fi olanlar bu noktada nas\u0131l hareket edeceklerini az \u00e7ok biliyor olacakt\u0131r; verilen haf\u0131za adresine giderek unicode olup olmamas\u0131na g\u00f6re verilen uzunluk kadar haf\u0131za al\u0131n\u0131p okunmal\u0131 ve gelen veri string&#8217;e d\u00f6n\u00fc\u015ft\u00fcr\u00fclmeli! Burada dikkatinizi \u00e7ekecektir; unicode olup olmad\u0131\u011f\u0131 bilgisi bool t\u00fcr\u00fcnde de\u011fildir. <strong>fUnicode<\/strong> alan\u0131n\u0131n 0 de\u011ferine sahip olmas\u0131 durumunda mesaj ANSI, aksi durumlarda ise UNICODE olarak tutulmaktad\u0131r. Buradaki p\u00fcf noktas\u0131, iletilen adres bilgisinin takip edilen uygulaman\u0131n haf\u0131za alan\u0131na g\u00f6re verilmi\u015f bir adres, g\u00f6receli bir adres olmas\u0131d\u0131r. Veri uygulaman\u0131n haf\u0131za alan\u0131 i\u00e7erisinden okunmal\u0131d\u0131r. Bu veriyi okumak i\u00e7in kernel32.dll i\u00e7erisinde bulunan <strong>ReadProcessMemory<\/strong> fonksiyonu kullan\u0131labilir. A\u015fa\u011f\u0131da C# i\u00e7erisinde kullan\u0131lmas\u0131 i\u00e7in gerekli olan tan\u0131mlamay\u0131 bulabilece\u011finiz bu fonksiyon \u00f6ncelikle okuman\u0131n yap\u0131laca\u011f\u0131 i\u015fleme ait handle&#8217;\u0131 beklemektedir. Verilen adresten okunan bilgiler ise <strong>lpBuffer<\/strong> ile belirtilen byte dizisine yaz\u0131l\u0131yor olacakt\u0131r. Okunan veri boyutu ise <strong>lpNumberOfBytesRead<\/strong> parametresi ile geri bildirilmektedir.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[DllImport(\"kernel32\", SetLastError = true, PreserveSig = true)]\npublic static extern bool ReadProcessMemory(IntPtr hProcess,\n                                            IntPtr lpBaseAddress,\n                                            [Out] byte[] lpBuffer,\n                                            int dwSize,\n                                            out int lpNumberOfBytesRead);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; ReadProcessMemory&nbsp; fonksiyonu bir haf\u0131za alan\u0131n\u0131 okurken \u00e7a\u011fr\u0131lan i\u015flemin okunacak olan i\u015flem haf\u0131za alan\u0131na eri\u015fim yetkisi olmas\u0131n\u0131 beklemektedir. \u00d6nceki makalemi hat\u0131rlayacak olursan\u0131z yeni bir oturumla i\u015flem ba\u015flatarak ya da ba\u011flanarak debug i\u015flemine ba\u015flad\u0131\u011f\u0131m\u0131z noktada i\u015fletim sistemi, hata ay\u0131klamas\u0131 yap\u0131lan i\u015flem ile debugger aras\u0131nda parent-child ili\u015fkisi kurmakta. Bu durumda da \u00fcst i\u015flem olan debugger rahatl\u0131kla alt i\u015flemi olan hata ay\u0131klamas\u0131 yap\u0131lan uygulaman\u0131n haf\u0131za alan\u0131na eri\u015febiliyor olacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Bu bilgiler \u0131\u015f\u0131\u011f\u0131nda, a\u015fa\u011f\u0131daki C# kod par\u00e7ac\u0131\u011f\u0131 ile uygulaman\u0131n belirtilen haf\u0131za alan\u0131na ula\u015fabilir ve debug mesaj\u0131n\u0131 okuyabiliriz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var outputDebugString = debugEvent.union.OutputDebugString;\nvar debugStringUzunlugu = outputDebugString.nDebugStringLength;\n\nvar tampon = new byte[debugStringUzunlugu];\nint okunanByteSayisi;\n\nReadProcessMemory(hProcess, outputDebugString.lpDebugStringData, tampon, debugStringUzunlugu, out okunanByteSayisi);<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Veriyi byte dizisi olarak okuduktan sonraki ad\u0131m\u0131m\u0131z ise string ifadeye \u00e7evirmek olmal\u0131;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">if (outputDebugString.fUnicode == 0) {\n    encoding = System.Text.Encoding.GetEncoding(1254);\n}\nelse {\n    encoding = new System.Text.UnicodeEncoding();\n}\n\nvar mesaj = encoding.GetString(tampon);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Burada&nbsp; g\u00f6z \u00f6n\u00fcne alman\u0131z gereken bir di\u011fer noktada mesaj\u0131n unicode olup olmamas\u0131na g\u00f6re okunmas\u0131 gerekli alan uzunlu\u011funun de\u011fi\u015fiyor oldu\u011fudur. Bildi\u011finiz gibi UNICODE karakterler haf\u0131zada ANSI karakterlerden farkl\u0131 olarak 2 byte yer kaplamaktad\u0131r. Bu durumda UNICODE mesajlar i\u00e7in okunmas\u0131 gereken alan boyutu bildirilenin iki kat\u0131 olmal\u0131d\u0131r.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/Debugger_DebugString.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/Debugger_DebugString_thumb.png\" alt=\"Debug i\u015flemi s\u0131ras\u0131nda gelen debug mesaj\u0131\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; \u0130lgili haf\u0131za alan\u0131na ula\u015farak debug mesaj\u0131n\u0131 okumam\u0131z ard\u0131nda debugger uygulamam\u0131z bunu kullan\u0131c\u0131ya g\u00f6sterebilecektir. \u00d6rnek debugger\u0131m\u0131zda bu mesaj \u0130\u015flem Hareketleri b\u00f6l\u00fcm\u00fcnde yer alan&nbsp; RichTextBox i\u00e7erisinde g\u00f6r\u00fclebilecektir.<\/p>\n\n\n\n<p>&nbsp;&nbsp; \u0130\u015fletim sistemince iletilen hata ay\u0131klamas\u0131 yap\u0131lan uygulaman\u0131n dll y\u00fcklemesi\/kald\u0131rmas\u0131 olay bildirimleri de debug mesaj\u0131nda oldu\u011fu gibi bize do\u011frudan kullan\u0131ma haz\u0131r bir bilgi sunmamaktad\u0131r. <strong>LOAD_DLL_DEBUG_EVENT<\/strong> ve <strong>UNLOAD_DLL_DEBUG_EVENT<\/strong> bildirimleri ile iletilen bu olaylara ait bilgiler s\u0131ras\u0131yla <strong>LOAD_DLL_DEBUG_INFO<\/strong> ve <strong>UNLOAD_DLL_DEBUG_INFO<\/strong> struct&#8217;lar\u0131 ile bizlere iletilecektir. A\u015fa\u011f\u0131da her iki struc&#8217;\u0131n C# i\u00e7erisinde tan\u0131mlanmas\u0131na dair kod par\u00e7ac\u0131klar\u0131n\u0131 bulabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[StructLayout(LayoutKind.Sequential)]\npublic struct LOAD_DLL_DEBUG_INFO {\n    public IntPtr hFile;\n    public IntPtr lpBaseOfDll;\n    public UInt32 dwDebugInfoFileOffset;\n    public UInt32 nDebugInfoSize;\n    public IntPtr lpImageName;\n    public UInt16 fUnicode;\n}\n\n[StructLayout(LayoutKind.Sequential)]\npublic struct UNLOAD_DLL_DEBUG_INFO {\n    public IntPtr lpBaseOfDll;\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Dikkat edecek olursan\u0131z y\u00fcklenen ya da kald\u0131r\u0131lan dll ad\u0131na do\u011frudan bir referans verilmeyerek dll hakk\u0131ndaki bilgilere yer verilmi\u015f durumda. Debug mesaj\u0131n\u0131 almak i\u00e7in yapt\u0131\u011f\u0131m\u0131z i\u015flemlere benzer \u015fekilde dll ad\u0131na ula\u015fabilmek i\u00e7in de Win32 API&#8217;leri ile fazlas\u0131yla muhatap olmam\u0131z gerekecektir. Verilen dll handle&#8217;\u0131n\u0131 kullanarak dll ad\u0131na ula\u015fmay\u0131 sa\u011flayan kodu a\u015fa\u011f\u0131da bulabilirsiniz. Benim taraf\u0131mdan yaz\u0131lmam\u0131\u015f olan bu kodun <a href=\"http:\/\/stackoverflow.com\/questions\/3314239\/obtain-a-filename-from-a-file-handle\" target=\"_blank\" rel=\"noopener noreferrer\">orjinali stackoverflow sitesinde<\/a> bulunabilir;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">internal class FileName {\n    [DllImport(\"kernel32.dll\")]\n    static extern uint GetFileSize(IntPtr hFile, IntPtr lpFileSizeHigh);\n\n    [DllImport(\"kernel32.dll\", SetLastError = true, CharSet = CharSet.Auto)]\n    public static extern IntPtr CreateFileMapping(\n        IntPtr hFile,\n        IntPtr lpFileMappingAttributes,\n        FileMapProtection flProtect,\n        uint dwMaximumSizeHigh,\n        uint dwMaximumSizeLow,\n        [MarshalAs(UnmanagedType.LPTStr)]string lpName);\n\n    [Flags]\n    public enum FileMapProtection : uint {\n        PageReadonly = 0x02,\n        PageReadWrite = 0x04,\n        PageWriteCopy = 0x08,\n        PageExecuteRead = 0x20,\n        PageExecuteReadWrite = 0x40,\n        SectionCommit = 0x8000000,\n        SectionImage = 0x1000000,\n        SectionNoCache = 0x10000000,\n        SectionReserve = 0x4000000,\n    }\n\n    [DllImport(\"kernel32.dll\", SetLastError = true)]\n    static extern IntPtr MapViewOfFile(\n        IntPtr hFileMappingObject,\n        FileMapAccess dwDesiredAccess,\n        uint dwFileOffsetHigh,\n        uint dwFileOffsetLow,\n        uint dwNumberOfBytesToMap);\n\n    [Flags]\n    public enum FileMapAccess : uint {\n        FileMapCopy = 0x0001,\n        FileMapWrite = 0x0002,\n        FileMapRead = 0x0004,\n        FileMapAllAccess = 0x001f,\n        fileMapExecute = 0x0020,\n    }\n\n    [DllImport(\"psapi.dll\", SetLastError = true)]\n    public static extern uint GetMappedFileName(IntPtr m_hProcess, IntPtr lpv, StringBuilder\n            lpFilename, uint nSize);\n\n    [DllImport(\"kernel32.dll\", SetLastError = true)]\n    static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);\n\n    [DllImport(\"kernel32.dll\", SetLastError = true)]\n    [return: MarshalAs(UnmanagedType.Bool)]\n    static extern bool CloseHandle(IntPtr hObject);\n\n    public static string GetFileNameFromHandle(IntPtr FileHandle) {\n        string fileName = String.Empty;\n        IntPtr fileMap = IntPtr.Zero, fileSizeHi = IntPtr.Zero;\n        UInt32 fileSizeLo = 0;\n\n        fileSizeLo = GetFileSize(FileHandle, fileSizeHi);\n\n        if (fileSizeLo == 0) {\n            \/\/ cannot map an 0 byte file\n            return \"Empty file.\";\n        }\n\n        fileMap = CreateFileMapping(FileHandle, IntPtr.Zero, FileMapProtection.PageReadonly, 0, 1, null);\n\n        if (fileMap != IntPtr.Zero) {\n            IntPtr pMem = MapViewOfFile(fileMap, FileMapAccess.FileMapRead, 0, 0, 1);\n            if (pMem != IntPtr.Zero) {\n                StringBuilder fn = new StringBuilder(250);\n                GetMappedFileName(System.Diagnostics.Process.GetCurrentProcess().Handle, pMem, fn, 250);\n                if (fn.Length &amp;gt; 0) {\n                    UnmapViewOfFile(pMem);\n                    CloseHandle(FileHandle);\n                    return fn.ToString();\n                }\n                else {\n                    UnmapViewOfFile(pMem);\n                    CloseHandle(FileHandle);\n                    return \"Empty filename.\";\n                }\n            }\n        }\n\n        return \"Empty filemap handle.\";\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Elinizde bu s\u0131n\u0131f olunca i\u015flerin geri kalan\u0131 olduk\u00e7a kolayla\u015f\u0131yor. Tek yapman\u0131z gereken a\u015fa\u011f\u0131daki kod ile dll dosyas\u0131 handle&#8217;\u0131n\u0131 bu s\u0131n\u0131f i\u00e7erisindeki static GetFileNameFromHandle fonksiyonuna ileterek dll ad\u0131n\u0131n bulunmas\u0131n\u0131 beklemek;&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var yuklenenDllAdi = FileName.GetFileNameFromHandle(debugEvent.union.LoadDll.hFile);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Dikkat edecek olursan\u0131z dll y\u00fcklenirken verilen pek \u00e7ok bilginin aksine dll&#8217;in kald\u0131r\u0131lmas\u0131 bildirilirken <strong>lpBaseOfDll<\/strong> parametresi ile sadece dll&#8217;in temel adresine dair bir i\u015faret\u00e7i iletilmekte. Peki bu durumda kald\u0131r\u0131lan dll ad\u0131na nas\u0131l ula\u015fabilirim? Bunun cevab\u0131 biraz ak\u0131ll\u0131ca davranmaya dayal\u0131 asl\u0131na bakarsan\u0131z. Bu takip etti\u011finiz uygulama i\u00e7in tekil olaca\u011f\u0131ndan ve bir dll&#8217;in kald\u0131r\u0131labilmesi i\u00e7in \u00f6ncelikle y\u00fcklenmi\u015f olmas\u0131 gerekece\u011finden dll y\u00fcklenirken temel adresi ve bulunan ad\u0131 bir s\u00f6zl\u00fckte tutulabilir. Dll kald\u0131r\u0131lmas\u0131 olay bildiriminde ise bu s\u00f6zl\u00fckten dll&#8217;in temel adresi ile yap\u0131lacak bir sorgu ile kald\u0131r\u0131lan dll ad\u0131na ula\u015f\u0131labilir.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Takip edilen i\u015flem sonlan\u0131rken i\u015fletim sistemi debugger&#8217;a <strong>EXIT_PROCESS_DEBUG_EVENT<\/strong> olay bildirimini yapacakt\u0131r. Bu olay bildirimiyle birlikte iletilen ve C# i\u00e7erisindeki tan\u0131mlamas\u0131 a\u015fa\u011f\u0131da verilen <strong>EXIT_PROCESS_DEBUG_INFO<\/strong> struct&#8217;\u0131 <strong>dwExitCode<\/strong> alan\u0131nda bize uygulaman\u0131n \u00e7\u0131k\u0131\u015f kodunu verecektir.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[StructLayout(LayoutKind.Sequential)]\npublic struct EXIT_PROCESS_DEBUG_INFO {\n    public UInt32 dwExitCode;\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Debugger\u0131m\u0131z bu olay bildirimi ile birlikte i\u015flemin sonland\u0131\u011f\u0131n\u0131 anlayarak debug d\u00f6ng\u00fcs\u00fcn\u00fc sonland\u0131rabilir. Hata ay\u0131klama amac\u0131yla ba\u011fland\u0131\u011f\u0131m\u0131z uygulama ile olan ba\u011fland\u0131 beklenmedik bir hata nedeniyle koparak hata ay\u0131klama i\u015flemi yar\u0131da da kalabilir. Bu durumlarda i\u015fletim sistemi <strong>RIP_EVENT<\/strong> olay bildirimini yap\u0131yor olacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Hata ay\u0131klama i\u015fleminin en \u00f6nemli ad\u0131mlar\u0131ndan birisi de takip edilen uygulama i\u00e7erisindeki hatalar\u0131n izleniyor olmas\u0131d\u0131r. \u00d6nceki makalemden de hat\u0131rlayaca\u011f\u0131n\u0131z gibi, i\u015flem i\u00e7erisine konulan breakpoint&#8217;ler debugger&#8217;a <strong>EXCEPTION_DEBUG_EVENT<\/strong> olay bildirimi ile iletilmektedir. Debugger&#8217;\u0131n hata ile breakpoint&#8217;i <strong>STATUS_BREAKPOINT<\/strong> (0\u00d780000003) hata kodu ile ay\u0131rt edebilece\u011fi bu durumlarda gelen <strong>EXCEPTION_DEBUG_INFO<\/strong> struct&#8217;\u0131n\u0131n C# i\u00e7erisindeki kullan\u0131m\u0131n\u0131 a\u015fa\u011f\u0131da bulabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[StructLayout(LayoutKind.Sequential)]\npublic struct EXCEPTION_DEBUG_INFO {\n    public EXCEPTION_RECORD ExceptionRecord;\n    public bool dwFirstChance;\n}\n\n[StructLayout(LayoutKind.Sequential)]\npublic struct EXCEPTION_RECORD {\n    public ExceptionCode ExceptionCode;\n    public ExceptionFlags ExceptionFlags;\n\n    public IntPtr ExceptionRecord;\n    public IntPtr ExceptionAddress;\n\n    public UInt32 NumberParameters;\n\n    public IntPtr ExceptionInformation0;\n    public IntPtr ExceptionInformation1;\n    public IntPtr ExceptionInformation2;\n    public IntPtr ExceptionInformation3;\n    public IntPtr ExceptionInformation4;\n    public IntPtr ExceptionInformation5;\n    public IntPtr ExceptionInformation6;\n    public IntPtr ExceptionInformation7;\n    public IntPtr ExceptionInformation8;\n    public IntPtr ExceptionInformation9;\n    public IntPtr ExceptionInformation10;\n    public IntPtr ExceptionInformation11;\n    public IntPtr ExceptionInformation12;\n    public IntPtr ExceptionInformation13;\n    public IntPtr ExceptionInformation14;\n}\n\npublic enum ExceptionCode : uint {\n    None = 0x0,\n    STATUS_BREAKPOINT = 0x80000003,\n    STATUS_SINGLESTEP = 0x80000004,\n    STATUS_ENTRYPOINT_NOT_FOUND = 0xC0000139,\n\n    EXCEPTION_INT_DIVIDE_BY_ZERO = 0xC0000094,\n\n    EXCEPTION_STACK_OVERFLOW = 0xC00000FD,\n    EXCEPTION_NONCONTINUABLE_EXCEPTION = 0xC0000025,\n    EXCEPTION_ACCESS_VIOLATION = 0xc0000005,\n}\n\n[Flags]\npublic enum ExceptionFlags : uint {\n    None = 0x0,\n    EXCEPTION_NONCONTINUABLE = 0x1,\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Hata koduna ExceptionRecord.ExceptionCode \u00fczerinden ula\u015f\u0131labilmesi m\u00fcmk\u00fcnd\u00fcr. Dikkat edecek olursan\u0131z yukar\u0131daki kod par\u00e7ac\u0131\u011f\u0131nda hata kodlar\u0131n\u0131 bir enum i\u00e7erisinde tutmaktay\u0131m. Bu enum s\u0131k kar\u015f\u0131la\u015f\u0131labilecek olan hata kodlar\u0131n\u0131 listelemekte olup t\u00fcm hata kodlar\u0131 yer almamaktad\u0131r. Kendi i\u015f mant\u0131\u011f\u0131n\u0131za g\u00f6re bu enum&#8217;u zenginle\u015ftirmeniz m\u00fcmk\u00fcnd\u00fcr. .Net uygulamalar\u0131nda gelen hata mesaj\u0131 tek olaca\u011f\u0131ndan maalesef ki ger\u00e7ek hata mesaj\u0131na ula\u015fmak sizi zorlayan bir s\u00fcre\u00e7 olacakt\u0131r. <strong>ExceptionFlags<\/strong> alan\u0131 bize hatan\u0131n kritik bir hata olup olmad\u0131\u011f\u0131 konusunda bilgi verirken <strong>dwFirstChance<\/strong> alan\u0131nda \u0130lk \u015fans ya ikinci \u015fans hatas\u0131 olup olmad\u0131\u011f\u0131 bilgisini verecektir.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Hata olay bildirimi alan debugger, hatan\u0131n t\u00fcr\u00fcne (<em>ilk \u015fans\/ikinci \u015fans<\/em>)&nbsp; ve hata koduna g\u00f6re belirtilen hatay\u0131 kendisi y\u00f6netebilir (<em>otomatik ya da kullan\u0131c\u0131ya sorarak<\/em>). \u0130\u015f mant\u0131\u011f\u0131 gere\u011fi al\u0131nan bu hata bilgisi ba\u015far\u0131l\u0131 bir \u015fekilde y\u00f6netilmi\u015f ve gerekli m\u00fcdahaleler ard\u0131ndan uygulaman\u0131n i\u015fleyi\u015fine kald\u0131\u011f\u0131 yerden devam etmesi isteniyorsa <strong>DBG_CONTINUE<\/strong> (<em>0x00010002<\/em>), hata y\u00f6netilememi\u015f ise i\u015flemin kendisinin y\u00f6netmesi i\u00e7in <strong>DBG_EXCEPTION_NOT_HANDLED<\/strong> (<em>0x80010001<\/em>) devam kodlar\u0131 ile durum i\u015fletim sistemine iletilmelidir.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Al\u0131nan hata kodu d\u0131\u015f\u0131nda registery&#8217;lerin durumu gibi ek bilgileri kullan\u0131c\u0131ya iletmek isterseniz Win32 API&#8217;sini biraz daha derinlemesine ara\u015ft\u0131rman\u0131z gerekecektir. \u00d6rnek olmas\u0131 ad\u0131na birlikte hata an\u0131ndaki registry de\u011ferlerini yazd\u0131ral\u0131m;<\/p>\n\n\n\n<p>&nbsp;&nbsp; Hata an\u0131ndaki i\u015flem durumunu alabilmek i\u00e7in kernel32.dll i\u00e7erisinde yer alan <strong>GetThreadContext<\/strong> fonksiyonu kullan\u0131labilir. Verilen thread handle&#8217;\u0131 i\u00e7in anl\u0131k i\u00e7eri\u011fi verecek olan bu fonksiyonu C# i\u00e7erisinde kullanabilmek i\u00e7in a\u015fa\u011f\u0131daki kod par\u00e7ac\u0131klar\u0131 kullan\u0131labilir;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[DllImport(\"kernel32\", SetLastError = true)]\npublic static extern bool GetThreadContext(IntPtr hThread, ref CONTEXT lpContext);\n\n[StructLayout(LayoutKind.Sequential)]\npublic struct CONTEXT {\n    public CONTEXT_FLAGS ContextFlags; \n\n    public uint Dr0;\n    public uint Dr1;\n    public uint Dr2;\n    public uint Dr3;\n    public uint Dr6;\n    public uint Dr7;\n\n    public FLOATING_SAVE_AREA FloatSave;\n\n    public uint SegGs;\n    public uint SegFs;\n    public uint SegEs;\n    public uint SegDs;\n\n    public uint Edi;\n    public uint Esi;\n    public uint Ebx;\n    public uint Edx;\n    public uint Ecx;\n    public uint Eax;\n\n    public uint Ebp;\n    public uint Eip;\n    public uint SegCs;\n    public uint EFlags;\n    public uint Esp;\n    public uint SegSs;\n\n    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]\n    public byte[] ExtendedRegisters;\n}\n\npublic enum CONTEXT_FLAGS : uint {\n    CONTEXT_i386 = 0x10000,\n    CONTEXT_i486 = 0x10000,\n    CONTEXT_CONTROL = CONTEXT_i386 | 0x01,\n    CONTEXT_INTEGER = CONTEXT_i386 | 0x02,\n    CONTEXT_SEGMENTS = CONTEXT_i386 | 0x04,\n    CONTEXT_FLOATING_POINT = CONTEXT_i386 | 0x08,\n    CONTEXT_DEBUG_REGISTERS = CONTEXT_i386 | 0x10,\n    CONTEXT_EXTENDED_REGISTERS = CONTEXT_i386 | 0x20,\n    CONTEXT_FULL = CONTEXT_CONTROL |\n                    CONTEXT_INTEGER |\n                    CONTEXT_SEGMENTS,\n    CONTEXT_ALL = CONTEXT_CONTROL |\n                    CONTEXT_INTEGER |\n                    CONTEXT_SEGMENTS |\n                    CONTEXT_FLOATING_POINT |\n                    CONTEXT_DEBUG_REGISTERS |\n                    CONTEXT_EXTENDED_REGISTERS\n}\n\n[StructLayout(LayoutKind.Sequential)]\npublic struct FLOATING_SAVE_AREA {\n    public uint ControlWord;\n    public uint StatusWord;\n    public uint TagWord;\n    public uint ErrorOffset;\n    public uint ErrorSelector;\n    public uint DataOffset;\n    public uint DataSelector;\n    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)]\n    public byte[] RegisterArea;\n    public uint Cr0NpxState;\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; A\u015fa\u011f\u0131daki kod par\u00e7ac\u0131\u011f\u0131 ise bize anl\u0131k context bilgisini iletecektir;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var context = new CONTEXT();\ncontext.ContextFlags = CONTEXT_FLAGS.CONTEXT_ALL;\n\nGetThreadContext(hThread, ref context);<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Dikkat edecek olursan\u0131z GetThreadContext&nbsp; fonksiyonu bizden i\u00e7eri\u011fi istenen i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n handle&#8217;\u0131n\u0131 beklemekte. Bu bilgi i\u015flem ilk ba\u015flat\u0131ld\u0131\u011f\u0131nda ya da ba\u011flan\u0131ld\u0131\u011f\u0131nda olu\u015fan <strong>CREATE_PROCESS_DEBUG_EVENT<\/strong> olay\u0131 s\u0131ras\u0131nda a\u015fa\u011f\u0131daki \u015fekilde bulunabilir;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">hThread = union.CreateProcess.hThread;<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Kodumuzun devam\u0131nda ise elde etti\u011fimiz bu i\u00e7erikten istedi\u011fimiz registery de\u011ferlerini kullan\u0131c\u0131ya g\u00f6sterebiliriz.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Bu noktadan sonra yap\u0131labilecek olan registery de\u011ferlerinin de\u011fi\u015ftirilmesi, kodun bir sonraki\/\u00f6nceki ad\u0131ma&nbsp; ta\u015f\u0131nmas\u0131 de\u011fi\u015fken de\u011ferlerinin okunmas\u0131\/de\u011fi\u015ftirilmesi gibi i\u015flemler tamamen Win32 API&#8217;leri \u00fczerinden yap\u0131labilecektir. \u0130leri kullan\u0131mlarda i\u015flemci ve registery&#8217;ler hakk\u0131nda da ayr\u0131nt\u0131l\u0131 bilgi sahibi olmak kesinlikle bir \u015fart olarak kar\u015f\u0131n\u0131za \u00e7\u0131kacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; A\u015fa\u011f\u0131da, \u015fimdiye kadar sizinle payla\u015fm\u0131\u015f oldu\u011fum bilgilerden yola \u00e7\u0131karak haz\u0131rlanm\u0131\u015f basit bir debugger projesi bulabilirsiniz. Proje i\u00e7erisinde yer alan CRM uygulamas\u0131 ile de debugger&#8217;\u0131 test edebilmeniz m\u00fcmk\u00fcn. \u00d6rnek debugger&#8217;\u0131m\u0131z\u0131n bir Windows Forms uygulamas\u0131 olmas\u0131 nedeniyle debug d\u00f6ng\u00fcs\u00fc s\u0131ras\u0131nda aray\u00fcz\u00fcn kilitlenmemesi ad\u0131na debug i\u015flemleri arka planda \u00e7al\u0131\u015fan bir i\u015f par\u00e7ac\u0131\u011f\u0131na ta\u015f\u0131nm\u0131\u015ft\u0131r. Proje i\u00e7erisinde yer alan Debugger s\u0131n\u0131f\u0131 i\u00e7erisindeki olay bildirimlerinin bu ayr\u0131 i\u015f par\u00e7ac\u0131\u011f\u0131nda bulunan debug d\u00f6ng\u00fcs\u00fcnce tetiklenmesi ve aray\u00fcz etkile\u015fimi yap\u0131lmas\u0131 nedeniyle bir senkronizasyon problemi olu\u015fuyor. Bu durumu \u00e7\u00f6zmek i\u00e7in; i\u015f par\u00e7ac\u0131\u011f\u0131 ba\u015flat\u0131l\u0131rken aray\u00fcz olaylar\u0131n\u0131n i\u015fletildi\u011fi ana i\u015f par\u00e7ac\u0131\u011f\u0131na ait <strong>SynchronizationContext<\/strong> (<em>SynchronizationContext.Current<\/em>) bilgisi verilerek olay tetiklenmelerinde a\u015fa\u011f\u0131da \u00f6rneklendi\u011fi \u015fekilde kod \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 sonucunda problem a\u015f\u0131lmaktad\u0131r;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">synchronizationContext.Send(\/*\u00c7a\u011fr\u0131lacak fonksiyon*\/, \/* parametreler*\/);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Bu \u015fekilde; belirtilen fonksiyon, verilen parametrelerle ilgili SynchronizationContext i\u00e7erisinde (<em>bizim \u00f6rne\u011fimizde aray\u00fcz<\/em>) \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor olacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Umuyorum ki \u015fimdiye kadar ki payla\u015f\u0131mlar\u0131m ard\u0131ndan kafan\u0131zda debug s\u00fcre\u00e7leri hakk\u0131nda bir resim, bir fikir olu\u015fmu\u015ftur. A\u015fa\u011f\u0131daki \u00f6rnek proje \u00fczerinden de pratik yapabilir, kodlar \u00fczerinde \u00e7al\u0131\u015farak kendi ihtiya\u00e7lar\u0131n\u0131z do\u011frultusunda \u00f6zelle\u015ftirilmi\u015f debugger&#8217;lar yazabilmeniz m\u00fcmk\u00fcn.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"32\" height=\"32\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/Archive.png\" alt=\"alt\" class=\"wp-image-8633\" srcset=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/Archive.png 32w, https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/Archive-12x12.png 12w\" sizes=\"auto, (max-width: 32px) 100vw, 32px\" \/><\/figure><\/div>\n\n\n\n<p><a href=\"https:\/\/fatihboy.com\/en\/post\/win32-debugger-yapiyoruz-2\/win32-debugger\/\" rel=\"attachment wp-att-8685\">Win32 Debugger<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>&nbsp;&nbsp;&nbsp; \u00d6nceki makalemde sizlerle birlikte Windows debug API&#8217;lerini tan\u0131m\u0131\u015f ve bu API&#8217;leri bir C# uygulamas\u0131 i\u00e7erisinden nas\u0131l eri\u015febilece\u011fimizi g\u00f6rm\u00fc\u015ft\u00fck. Makalemin sonuna geldi\u011fimizde ise en basit haliyle bir debug uygulamas\u0131 olu\u015fturabilmi\u015f, \u00e7al\u0131\u015fan bir uygulamaya ba\u011flanabilmi\u015f ya da debug moduyla yeni bir i\u015flem ba\u015flatabilmi\u015ftik. Bir debugger&#8217;\u0131n en temel bile\u015feni olan debug d\u00f6ng\u00fcs\u00fcn\u00fcn nas\u0131l oldu\u011funu g\u00f6rerek basit bir&#8230;<\/p>\n<p><a class=\"read-more\" href=\"https:\/\/fatihboy.com\/en\/win32-debugger-yapiyoruz-2\/\">Read More<\/a><\/p>","protected":false},"author":1,"featured_media":33588,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[77,28],"tags":[118],"class_list":["post-8679","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-csharp","category-turkce","tag-hata-ayiklama"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Win32 Debugger Yap\u0131yoruz \u2013 2 - Fatih Boy<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihboy.com\/en\/win32-debugger-yapiyoruz-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Win32 Debugger Yap\u0131yoruz \u2013 2 - Fatih Boy\" \/>\n<meta property=\"og:description\" content=\"&nbsp;&nbsp;&nbsp; \u00d6nceki makalemde sizlerle birlikte Windows debug API&#8217;lerini tan\u0131m\u0131\u015f ve bu API&#8217;leri bir C# uygulamas\u0131 i\u00e7erisinden nas\u0131l eri\u015febilece\u011fimizi g\u00f6rm\u00fc\u015ft\u00fck. Makalemin sonuna geldi\u011fimizde ise en basit haliyle bir debug uygulamas\u0131 olu\u015fturabilmi\u015f, \u00e7al\u0131\u015fan bir uygulamaya ba\u011flanabilmi\u015f ya da debug moduyla yeni bir i\u015flem ba\u015flatabilmi\u015ftik. Bir debugger&#8217;\u0131n en temel bile\u015feni olan debug d\u00f6ng\u00fcs\u00fcn\u00fcn nas\u0131l oldu\u011funu g\u00f6rerek basit bir...Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihboy.com\/en\/win32-debugger-yapiyoruz-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Fatih Boy\" \/>\n<meta property=\"article:published_time\" content=\"2011-01-27T20:50:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-06-19T07:09:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/tool-kit.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"1199\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Fatih Boy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Boy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/\"},\"author\":{\"name\":\"Fatih Boy\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"headline\":\"Win32 Debugger Yap\u0131yoruz \u2013 2\",\"datePublished\":\"2011-01-27T20:50:00+00:00\",\"dateModified\":\"2021-06-19T07:09:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/\"},\"wordCount\":2326,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/tool-kit.jpg\",\"keywords\":[\"Hata Ayiklama\"],\"articleSection\":[\"C#\",\"T\u00fcrk\u00e7e\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/\",\"url\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/\",\"name\":\"Win32 Debugger Yap\u0131yoruz \u2013 2 - Fatih Boy\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/tool-kit.jpg\",\"datePublished\":\"2011-01-27T20:50:00+00:00\",\"dateModified\":\"2021-06-19T07:09:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#primaryimage\",\"url\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/tool-kit.jpg\",\"contentUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/tool-kit.jpg\",\"width\":1800,\"height\":1199},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fatihboy.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Win32 Debugger Yap\u0131yoruz \u2013 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihboy.com\/#website\",\"url\":\"https:\/\/fatihboy.com\/\",\"name\":\"Fatih Boy\",\"description\":\"Ki\u015fisel Web Sitesi\",\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihboy.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\",\"name\":\"Fatih Boy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"caption\":\"Fatih Boy\"},\"logo\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/fatihboy.com\"],\"url\":\"https:\/\/fatihboy.com\/en\/author\/fatih\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Win32 Debugger Yap\u0131yoruz \u2013 2 - Fatih Boy","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihboy.com\/en\/win32-debugger-yapiyoruz-2\/","og_locale":"en_US","og_type":"article","og_title":"Win32 Debugger Yap\u0131yoruz \u2013 2 - Fatih Boy","og_description":"&nbsp;&nbsp;&nbsp; \u00d6nceki makalemde sizlerle birlikte Windows debug API&#8217;lerini tan\u0131m\u0131\u015f ve bu API&#8217;leri bir C# uygulamas\u0131 i\u00e7erisinden nas\u0131l eri\u015febilece\u011fimizi g\u00f6rm\u00fc\u015ft\u00fck. Makalemin sonuna geldi\u011fimizde ise en basit haliyle bir debug uygulamas\u0131 olu\u015fturabilmi\u015f, \u00e7al\u0131\u015fan bir uygulamaya ba\u011flanabilmi\u015f ya da debug moduyla yeni bir i\u015flem ba\u015flatabilmi\u015ftik. Bir debugger&#8217;\u0131n en temel bile\u015feni olan debug d\u00f6ng\u00fcs\u00fcn\u00fcn nas\u0131l oldu\u011funu g\u00f6rerek basit bir...Read More","og_url":"https:\/\/fatihboy.com\/en\/win32-debugger-yapiyoruz-2\/","og_site_name":"Fatih Boy","article_published_time":"2011-01-27T20:50:00+00:00","article_modified_time":"2021-06-19T07:09:31+00:00","og_image":[{"width":1800,"height":1199,"url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/tool-kit.jpg","type":"image\/jpeg"}],"author":"Fatih Boy","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Fatih Boy","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#article","isPartOf":{"@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/"},"author":{"name":"Fatih Boy","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"headline":"Win32 Debugger Yap\u0131yoruz \u2013 2","datePublished":"2011-01-27T20:50:00+00:00","dateModified":"2021-06-19T07:09:31+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/"},"wordCount":2326,"commentCount":0,"publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"image":{"@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/tool-kit.jpg","keywords":["Hata Ayiklama"],"articleSection":["C#","T\u00fcrk\u00e7e"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/","url":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/","name":"Win32 Debugger Yap\u0131yoruz \u2013 2 - Fatih Boy","isPartOf":{"@id":"https:\/\/fatihboy.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#primaryimage"},"image":{"@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/tool-kit.jpg","datePublished":"2011-01-27T20:50:00+00:00","dateModified":"2021-06-19T07:09:31+00:00","breadcrumb":{"@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#primaryimage","url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/tool-kit.jpg","contentUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/tool-kit.jpg","width":1800,"height":1199},{"@type":"BreadcrumbList","@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fatihboy.com\/"},{"@type":"ListItem","position":2,"name":"Win32 Debugger Yap\u0131yoruz \u2013 2"}]},{"@type":"WebSite","@id":"https:\/\/fatihboy.com\/#website","url":"https:\/\/fatihboy.com\/","name":"Fatih Boy","description":"Ki\u015fisel Web Sitesi","publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihboy.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158","name":"Fatih Boy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","caption":"Fatih Boy"},"logo":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/fatihboy.com"],"url":"https:\/\/fatihboy.com\/en\/author\/fatih\/"}]}},"brizy_media":[],"_links":{"self":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8679","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/comments?post=8679"}],"version-history":[{"count":2,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8679\/revisions"}],"predecessor-version":[{"id":33590,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8679\/revisions\/33590"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media\/33588"}],"wp:attachment":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media?parent=8679"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/categories?post=8679"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/tags?post=8679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}