{"id":8667,"date":"2011-01-26T23:40:00","date_gmt":"2011-01-26T21:40:00","guid":{"rendered":"https:\/\/fatihboy.com\/post\/win32-debugger-yapiyoruz"},"modified":"2021-06-19T10:11:29","modified_gmt":"2021-06-19T07:11:29","slug":"win32-debugger-yapiyoruz-1","status":"publish","type":"post","link":"https:\/\/fatihboy.com\/en\/win32-debugger-yapiyoruz-1\/","title":{"rendered":"Win32 Debugger Yap\u0131yoruz &#8211; 1"},"content":{"rendered":"<p>&nbsp; Hata ay\u0131klama konusunda \u015fimdiye kadar ki payla\u015f\u0131mlar\u0131mda sizlerle birlikte nas\u0131l minidump alabilece\u011fimizi ve ADPlus uygulamas\u0131n\u0131 nas\u0131l kullanabilece\u011fimizi incelemi\u015f, size birinci ve ikinci \u015fans hatalardan bahsetmi\u015ftim. Yaz\u0131lar\u0131m\u0131n devam\u0131nda art\u0131k daha zevkli, daha faydal\u0131 olaca\u011f\u0131na inand\u0131\u011f\u0131m konulara de\u011finmeyi planl\u0131yorum. Hem ilerleyen makalelere bir zemim olu\u015fturmas\u0131, hem de Windows&#8217;un hata ay\u0131klama konusunda bize sunduklar\u0131n\u0131 daha yak\u0131ndan g\u00f6rebilmek ad\u0131na bu makalemde birlikte en basit \u015fekliyle bir debugger uygulamas\u0131n\u0131n nas\u0131l yaz\u0131labilece\u011fini anlataca\u011f\u0131m.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Makalemde sizlerle payla\u015faca\u011f\u0131m debugger uygulamas\u0131 temelde Windows&#8217;un bize sundu\u011fu ve detaylar\u0131 <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms679303(v=VS.85).aspx\">MSDN Debugging Functions<\/a> sayfas\u0131ndan bulunan Win32 Debug API&#8217;lerini kullanacakt\u0131r. Ad\u0131m ad\u0131m ilerlemek ad\u0131na, birlikte geli\u015ftirece\u011fimiz ilk debugger&#8217;\u0131m\u0131z sadece unmanaged debug olay bildirimlerini takip edecek; fakat \u00fcz\u00fclmeyin bunlar\u0131 kullanarak bile olduk\u00e7a g\u00fczel uygulamalar geli\u015ftirmemiz m\u00fcmk\u00fcn.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Debugger uygulamalar\u0131, temelde Windows \u00fczerinden \u00e7al\u0131\u015fan bir\/bir ka\u00e7 i\u015flemi\/uygulamay\u0131 izleyerek bu i\u015flemlerde meydana gelen hata, i\u015flem olu\u015fmas\u0131\/sonlanmas\u0131, i\u015f par\u00e7ac\u0131\u011f\u0131 olu\u015fmas\u0131\/sonlanmas\u0131, dll y\u00fcklenmesi\/kald\u0131r\u0131lmas\u0131 v.b. olay bildirimlerine g\u00f6re kullan\u0131c\u0131y\u0131 bilgilendirerek hata ay\u0131klanmas\u0131n\u0131 sa\u011flayan uygulamalard\u0131r. Windows hata ay\u0131klama API&#8217;leri debugger geli\u015ftiricilerine bir uygulamadaki hatalar\u0131 ay\u0131rmak i\u00e7in iki se\u00e7enek sunmu\u015ftur. Bu se\u00e7eneklerden ilkinde debugger \u00e7al\u0131\u015fan bir i\u015flemi izlemeye ba\u015flayabilirken di\u011ferinde ise uygulama debugger taraf\u0131ndan hata ay\u0131klama modunda ba\u015flat\u0131labilir. Kullan\u0131c\u0131 hata ay\u0131klamak istedi\u011fi noktaya (<em>\u00f6rne\u011fin; uygulaman\u0131n hemen ba\u015flang\u0131c\u0131nda ya da belirli bir girdi topland\u0131ktan sonra..<\/em>) g\u00f6re bu iki y\u00f6ntemden uygun olan\u0131 se\u00e7melidir. Her iki y\u00f6ntemde de debugger&#8217;\u0131m\u0131z ve takip etti\u011fimiz uygulama iki farkl\u0131 i\u015flem olarak \u00e7al\u0131\u015facak; fakat debugger, takip edilen uygulaman\u0131n parent&#8217;\u0131 olarak ayarlanacakt\u0131r. Bu sayede debugger&#8217;\u0131m\u0131z takip etti\u011fi uygulamada olu\u015fan olaylardan haberdar olabilirken olas\u0131 hatalar\u0131ndan da etkilenmeyecektir. Bu konuda d\u00fc\u015f\u00fclmesi gereken \u00f6nemli bir not; bir i\u015flem ayn\u0131 anda sadece tek bir debugger uygulamas\u0131nca takip edilebildi\u011fidir. Bunun nedeni, sizin de tahmin edebilece\u011finiz gibi, bir i\u015fleme ayn\u0131 anda tek bir parent atanabiliyor olmas\u0131d\u0131r. Debugger a\u00e7\u0131s\u0131ndan bak\u0131ld\u0131\u011f\u0131nda ise; bir uygulaman\u0131n ayn\u0131 anda pek \u00e7ok alt i\u015flemi olabilmesi nedeniyle herhangi bir s\u0131k\u0131nt\u0131 bulunmay\u0131p, debugger istedi\u011fi kadar uygulamaya ba\u011flanarak takip edebilmektedir.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; E\u011fer geli\u015ftirdi\u011fimiz debugger ile \u00e7al\u0131\u015fan bir i\u015flemi takip etmek istersek, <strong>kernel32.dll<\/strong> i\u00e7erisinde yer alan <strong>DebugActiveProcess<\/strong> Win32 debug API fonksiyonunu kullanarak takip edilecek i\u015fleme ba\u011flanmal\u0131y\u0131z. Kullan\u0131m\u0131 hakk\u0131ndaki detayl\u0131 bilgiyi <a href=\"\/\/msdn.microsoft.com\/en-us\/library\/ms679295(v=vs.85).aspx\" target=\"_blank\" rel=\"noopener noreferrer\">MSDN sitesinde<\/a> bulabilece\u011finiz DebugActiveProcess fonksiyonunu a\u015fa\u011f\u0131daki basit tan\u0131mlama ard\u0131ndan C# uygulaman\u0131zda ayn\u0131 bir normal fonksiyon gibi kullanman\u0131z m\u00fcmk\u00fcn;<\/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\")]\n[return: MarshalAs(UnmanagedType.Bool)]\nstatic extern bool DebugActiveProcess(uint dwProcessId);<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Olduk\u00e7a basit bir aray\u00fcze sahip olan bu fonksiyon, parametre olarak sadece takip edilecek olan i\u015flemin id&#8217;sini beklemektedir. Fonksiyonun \u00e7a\u011f\u0131r\u0131lmas\u0131 sonucunda, belirtilen i\u015fleme ba\u015far\u0131l\u0131 bir \u015fekilde ba\u011flan\u0131lmas\u0131 durumunda <em>true<\/em>, aksi durumlarda ise <em>false<\/em> yan\u0131t\u0131 al\u0131nacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; E\u011fer debugger\u0131m\u0131z\u0131n takip etmek istedi\u011fimiz bir uygulamay\u0131 en ba\u015f\u0131ndan itibaren izlemesini istiyorsak, yapmam\u0131z gereken Win32 API&#8217;leri vas\u0131tas\u0131yla debug yap\u0131laca\u011f\u0131n\u0131 bildirerek yeni bir i\u015flem ba\u015flatmak olmal\u0131d\u0131r. Windows yeni bir i\u015flem ba\u015flatmak i\u00e7in bizlere kernel32.dll i\u00e7erisinde <strong>CreateProcess<\/strong> Win32 API fonksiyonunu sunmu\u015ftur. DebugActiveProcess fonksiyonunda oldu\u011fu gibi a\u015fa\u011f\u0131daki tan\u0131mlama ard\u0131ndan bu fonksiyonu da C# uygulamam\u0131z i\u00e7erisinde kullanmam\u0131z m\u00fcmk\u00fcn olacakt\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=\"\">[DllImport(\"kernel32\")]\npublic static extern bool CreateProcess(string lpApplicationName,\n                                        string lpCommandLine,\n                                        IntPtr lpProcessAttributes,\n                                        IntPtr lpThreadAttributes,\n                                        bool bInheritHandles,\n                                        ProcessCreationFlags dwCreationFlags,\n                                        IntPtr lpEnvironment,\n                                        string lpCurrentDirectory,\n                                        ref STARTUPINFO lpStartupInfo,\n                                        out PROCESS_INFORMATION lpProcessInformation);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; MSDN web sitesinde <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms682425(v=vs.85).aspx\" target=\"_blank\" rel=\"noopener noreferrer\">dok\u00fcmantasyonu<\/a>nu bulabilece\u011finiz CreateProcess fonksiyonunda <strong>dwCreationFlags<\/strong> parametresi yard\u0131m\u0131yla Windows&#8217;a ba\u015flat\u0131lacak olan i\u015flemin debugger taraf\u0131ndan hata ay\u0131klama i\u015flemine tabi olaca\u011f\u0131n\u0131 belirtebilirsiniz. Bu ama\u00e7la dwCreationFlags parametresinden; sadece bu i\u015flemde hata ay\u0131kla (<strong>DEBUG_ONLY_THIS_PROCESS<\/strong>) veya bu i\u015flem ve t\u00fcm alt i\u015flemlerinde hata ay\u0131kla (<strong>DEBUG_PROCESS<\/strong>) denilmesi m\u00fcmk\u00fcnd\u00fcr. Bu fonksiyonun \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 sonras\u0131nda i\u015flemin ba\u015far\u0131l\u0131 olmas\u0131 halinde <em>true<\/em>; aksi hallerde <em>false<\/em> de\u011feri d\u00f6necektir. Ba\u015far\u0131l\u0131 bir i\u015flem ba\u015flat\u0131lmas\u0131 sonras\u0131nda; ba\u015flat\u0131lan bu i\u015flem hakk\u0131ndaki bilgiler <strong>lpProcessInformation<\/strong> parametresi ile uygulamaya geri g\u00f6nderiliyor olacakt\u0131r. A\u015fa\u011f\u0131da \u00f6rnek bir i\u015flem ba\u015flatma kodunu ve&nbsp; kullan\u0131lan <strong>STARTUPINFO<\/strong> ile <strong>PROCESS_INFORMATION<\/strong> struct&#8217;lar\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=\"\">[DllImport(\"kernel32\")]\npublic static extern bool CreateProcess(string lpApplicationName,\n                                        string lpCommandLine,\n                                        IntPtr lpProcessAttributes,\n                                        IntPtr lpThreadAttributes,\n                                        bool bInheritHandles,\n                                        ProcessCreationFlags dwCreationFlags,\n                                        IntPtr lpEnvironment,\n                                        string lpCurrentDirectory,\n                                        ref STARTUPINFO lpStartupInfo,\n                                        out PROCESS_INFORMATION lpProcessInformation);\n\npublic enum ProcessCreationFlags : uint {\n    CREATE_BREAKAWAY_FROM_JOB = 0x01000000,\n    CREATE_DEFAULT_ERROR_MODE = 0x04000000,\n    CREATE_NEW_CONSOLE = 0x00000010,\n    CREATE_NEW_PROCESS_GROUP = 0x00000200,\n    CREATE_NO_WINDOW = 0x08000000,\n    CREATE_PROTECTED_PROCESS = 0x00040000,\n    CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000,\n    CREATE_SEPARATE_WOW_VDM = 0x00000800,\n    CREATE_SHARED_WOW_VDM = 0x00001000,\n    CREATE_SUSPENDED = 0x00000004,\n    CREATE_UNICODE_ENVIRONMENT = 0x00000400,\n    DEBUG_ONLY_THIS_PROCESS = 0x00000002,\n    DEBUG_PROCESS = 0x00000001,\n    DETACHED_PROCESS = 0x00000008,\n    EXTENDED_STARTUPINFO_PRESENT = 0x00080000,\n    INHERIT_PARENT_AFFINITY = 0x00010000\n}\n\n[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]\npublic struct STARTUPINFO {\n    public uint cb;\n    public string lpReserved;\n    public string lpDesktop;\n    public string lpTitle;\n    public uint dwX;\n    public uint dwY;\n    public uint dwXSize;\n    public uint dwYSize;\n    public uint dwXCountChars;\n    public uint dwYCountChars;\n    public uint dwFillAttribute;\n    public uint dwFlags;\n    public short wShowWindow;\n    public short cbReserved2;\n    public IntPtr lpReserved2;\n    public IntPtr hStdInput;\n    public IntPtr hStdOutput;\n    public IntPtr hStdError;\n}\n\n[StructLayout(LayoutKind.Sequential)]\npublic struct PROCESS_INFORMATION {\n    public IntPtr hProcess;\n    public IntPtr hThread;\n    public uint dwProcessId;\n    public uint dwThreadId;\n}\n\n\/\/...\n\/\/--------------------------------------\n\/\/  \u0130\u015flemin Debug moduyla ba\u015flat\u0131lmas\u0131\n\/\/--------------------------------------\n\/\/...\n\nvar startupInfo = new STARTUPINFO();\nvar processInformation = new PROCESS_INFORMATION();\n\nstartupInfo.cb = (uint)Marshal.SizeOf(startupInfo);\n\nCreateProcess(\"C:\\hataliUygulama.exe\",\n              null,\n              IntPtr.Zero,\n              IntPtr.Zero,\n              false,\n              ProcessCreationFlags.CREATE_NEW_CONSOLE | ProcessCreationFlags.DEBUG_ONLY_THIS_PROCESS,\n              IntPtr.Zero,\n              null,\n              ref startupInfo,\n              out processInformation);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Yukar\u0131daki kodun i\u015fletilmesi sonras\u0131nda processInformation.hProcess&nbsp; de\u011feri bize ba\u015flat\u0131lan i\u015flemin handle&#8217;\u0131n\u0131 verecektir. \u0130sterseniz bu handle&#8217;\u0131 kullanarak kernel32.dll&#8217;i i\u00e7erisindeki GetProcessId fonksiyonu yard\u0131m\u0131yla da process&#8217;in id&#8217;sine eri\u015febilir ve bu id&#8217;yi kullanarak System.Diagnostics.Process i\u00e7erisindeki static GetProcessById fonksiyonu yard\u0131m\u0131yla da t\u00fcm i\u015flem bilgilerine ula\u015fabilirsiniz. Bu i\u015fleme dair \u00f6rnek bir kullan\u0131m\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=\"\">[DllImport(\"kernel32\")]\npublic static extern int GetProcessId(IntPtr hProcess);\n\n\/\/--------------------------------------\n\nvar processId = GetProcessId(processInformation.hProcess);\n\nislem = System.Diagnostics.Process.GetProcessById(processId);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; T\u00fcm bu i\u015flemler ard\u0131ndan herhangi bir s\u0131k\u0131nt\u0131 ya\u015fanmamas\u0131 ad\u0131na processInformation.hProcess ve processInformation.hThread&nbsp; handle&#8217;lar\u0131n\u0131 a\u015fa\u011f\u0131daki \u015fekilde kapatman\u0131z \u00f6nemlidir;<\/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\")]\npublic static extern IntPtr CloseHandle(IntPtr handle);\n\n\/\/--------------------------------------\n\n\/\/...\n\nCloseHandle(processInformation.hProcess);\nCloseHandle(processInformation.hThread);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Yukar\u0131daki bilgiler \u0131\u015f\u0131\u011f\u0131nda, \u015fimdiye kadar geldi\u011fimiz noktada mevcutta \u00e7al\u0131\u015fan bir i\u015fleme hata ay\u0131klama ama\u00e7l\u0131 olarak ba\u011flanabilir ya da yeni bir i\u015flem ba\u015flatabiliriz. Hangi y\u00f6ntem se\u00e7ilmi\u015f olursa olsun, debugger&#8217;\u0131m\u0131z\u0131n bundan sonraki kodlar\u0131 ortak olacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Hata ay\u0131klamas\u0131 yap\u0131lacak olan i\u015flemi ba\u015flatt\u0131ktan\/ba\u011fland\u0131ktan sonra debugger\u0131m\u0131z art\u0131k olay bildirimlerini alacak ve y\u00f6netecek oldu\u011fu <strong>debug d\u00f6ng\u00fcs\u00fc<\/strong>ne girmelidir. Debug d\u00f6ng\u00fcs\u00fc, uygulaman\u0131n kendisinin ya da debugger&#8217;\u0131n i\u015flemi bir \u015fekilde sonland\u0131rmas\u0131na kadar debugger&#8217;\u0131n i\u015flem bildirimlerini dinledi\u011fi ve gelen bu bildirimler do\u011frultusunda da (<em>kimi zaman<\/em>) kullan\u0131c\u0131yla etkile\u015ferek i\u015flemler ge\u00e7ekle\u015ftirdi\u011fi d\u00f6ng\u00fcd\u00fcr. Debugger, temelde bu d\u00f6ng\u00fcn\u00fcn ba\u015f\u0131nda i\u015flem olaylar\u0131n\u0131 dinlemeli, devam\u0131nda kendi i\u015f mant\u0131klar\u0131n\u0131 i\u015fletmeli ve son olarak da bir sonraki olay bildirimini dinlemek \u00fczere ba\u011fland\u0131\u011f\u0131 i\u015flemin i\u015fleyi\u015fine devam etmesini sa\u011flamal\u0131d\u0131r.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/debug_dongusu.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/debug_dongusu_thumb.png\" alt=\"Debug D\u00f6ng\u00fcs\u00fc\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Bu noktada debug d\u00f6ng\u00fcs\u00fcn\u00fcn en \u00f6nemli bile\u015fenleri olan olay dinleme ve i\u015fleyi\u015fe devam etmek i\u00e7in kernel32.dll&#8217;i i\u00e7erisinde bulunan <strong>WaitForDebugEvent<\/strong> ve <strong>ContinueDebugEvent<\/strong> fonksiyonlar\u0131 kullan\u0131lmal\u0131d\u0131r. WaitForDebugEvent fonksiyon \u00e7a\u011fr\u0131s\u0131yla bir olay bildirilmesi s\u0131ras\u0131nda i\u015fletim sistemi debugger taraf\u0131ndan ba\u011flan\u0131lm\u0131\u015f olan i\u015flem ve t\u00fcm alt i\u015f par\u00e7ac\u0131klar\u0131n\u0131 tamamen durdurarak debugger&#8217;\u0131n i\u015f mant\u0131klar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmas\u0131na olanak sa\u011flam\u0131\u015ft\u0131r. Bu \u015fekilde durdurulmu\u015f olan bir i\u015flemin i\u015fleyi\u015fine devam etmesi i\u00e7in debugger taraf\u0131ndan ContinueDebugEvent fonksiyon \u00e7a\u011fr\u0131s\u0131 yap\u0131larak i\u015fleyi\u015fe hangi durum bilgisi ile devam edilece\u011fi bildirilmelidir. Bir hata olay bildirimini ele alacak olursak pek \u00e7ok hata ilk bildiriminde g\u00f6z ard\u0131 edilerek uygulama taraf\u0131ndan gerekli kontroller yap\u0131labilmekte (<em>Birinci ve ikinci \u015fans hatalar hakk\u0131nda <\/em><a href=\"\/en\/?p=8637\"><em>bu makalemde<\/em><\/a><em> detayl\u0131 bilgi bulabilirsiniz<\/em>), bu durumda verilmesi gereken durum bilgisi <strong>DBG_EXCEPTION_NOT_HANDLED<\/strong> olmal\u0131d\u0131r. A\u015fa\u011f\u0131da, her iki Win32 API fonksiyonunu da C# uygulamam\u0131zda kullanabilmemiz i\u00e7in gerekli olan tan\u0131mlamalar\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=\"\">[DllImport(\"kernel32\")]\n[return: MarshalAs(UnmanagedType.Bool)]\npublic static extern bool WaitForDebugEvent(ref DebugEvent pDebugEvent, int dwMilliseconds);\n\n[DllImport(\"kernel32\")]\n[return: MarshalAs(UnmanagedType.Bool)]\npublic static extern bool ContinueDebugEvent(uint dwProcessId, uint dwThreadId, ContinueStatus dwContinueStatus);<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; WaitForDebugEvent fonksiyonu <strong>dwMilliseconds<\/strong> parametresi ile belirtilen s\u00fcre kadar bekleyerek olas\u0131 Debug olay bildirimlerini yakalayacak ve bildirime ait verileri <strong>pDebugEvent<\/strong> parametresi ile uygulamam\u0131za iletecektir. Fonksiyonun sonsuz bir bekleme durumunda kalmas\u0131 isteniyorsa, dwMilliseconds parametresine <em>0xffff<\/em> de\u011feri verilebilir. Belirtilen s\u00fcre sonunda, hen\u00fcz bir bildirim olmamas\u0131 durumunda fonksiyon <em>false<\/em> de\u011ferini d\u00f6nerken, bildirim gelmesi durumunda <em>true<\/em> de\u011feri al\u0131nacakt\u0131r. Debugger&#8217;\u0131m\u0131z gelen bu de\u011fere g\u00f6re kendi i\u015f mant\u0131\u011f\u0131nda yap\u0131lmas\u0131 gerekene karar verecektir.<\/p>\n\n\n\n<p>&nbsp;&nbsp; WaitForDebugEvent ile ilgili bilinmesi gereken \u00f6nemli bir nokta da bu fonksiyonun belirtilen zaman a\u015f\u0131m\u0131na ula\u015f\u0131ncaya ya da debug olay bildirimi al\u0131n\u0131ncaya kadar bir de\u011fer d\u00f6nmeyerek i\u00e7inde bulundu\u011fu i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 kilitliyor olmas\u0131d\u0131r. Bu durumda, debugger&#8217;\u0131n\u0131z bir forms uygulamas\u0131 ise debug d\u00f6ng\u00fcs\u00fcn\u00fcn aray\u00fcz i\u015f par\u00e7ac\u0131\u011f\u0131ndan ayr\u0131, ikinci bir i\u015f par\u00e7ac\u0131\u011f\u0131nda \u00e7al\u0131\u015f\u0131yor olmas\u0131 \u00f6nemlidir. Aksi takdirde debugger\u0131 uygulamam\u0131z i\u015fletim sistemi bildirimlerini al\u0131p i\u015fleyemeyece\u011finden dolay\u0131 aray\u00fcz\u00fcnde donmalar\/kilitlenmeler g\u00f6r\u00fclecektir. Bu bilgilendirme ard\u0131ndan debug d\u00f6ng\u00fcs\u00fcn\u00fc ayr\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131nda \u00e7al\u0131\u015ft\u0131raca\u011f\u0131n\u0131z\u0131 d\u00fc\u015f\u00fcnerek yine belirtmem gereken \u00f6nemli bir di\u011fer noktada hata ay\u0131klanacak olan&nbsp; i\u015fleme ba\u011flanma kodu ile debug d\u00f6ng\u00fcs\u00fc kodunun ayn\u0131 i\u015f par\u00e7ac\u0131\u011f\u0131 i\u00e7erisinde \u00e7al\u0131\u015fmas\u0131 gerekti\u011fidir.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Hata ay\u0131klama i\u015flemi s\u0131ras\u0131nda debugger&#8217;\u0131m\u0131z hata bilgisi, i\u015f par\u00e7ac\u0131\u011f\u0131 olu\u015fturulmas\u0131\/kald\u0131r\u0131lmas\u0131, i\u015flem olu\u015fturulmas\u0131\/kald\u0131r\u0131lmas\u0131, debug mesaj\u0131 g\u00f6nderilmesi, dll y\u00fcklenmesi\/kald\u0131r\u0131lmas\u0131, i\u015flemin \u00f6l\u00fc duruma gelmesi&nbsp; gibi pek \u00e7ok de\u011fi\u015fik olay bildirimini alacakt\u0131r. MSDN \u00fczerinden <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms679308(v=vs.85).aspx\" target=\"_blank\" rel=\"noopener noreferrer\">dok\u00fcmantasyonu<\/a>nu bulabilece\u011finiz DebugEvent struct&#8217;\u0131 a\u015fa\u011f\u0131daki yap\u0131ya sahiptir;<\/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=\"\">typedef struct _DEBUG_EVENT {\n  DWORD dwDebugEventCode;\n  DWORD dwProcessId;\n  DWORD dwThreadId;\n  union {\n    EXCEPTION_DEBUG_INFO      Exception;\n    CREATE_THREAD_DEBUG_INFO  CreateThread;\n    CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;\n    EXIT_THREAD_DEBUG_INFO    ExitThread;\n    EXIT_PROCESS_DEBUG_INFO   ExitProcess;\n    LOAD_DLL_DEBUG_INFO       LoadDll;\n    UNLOAD_DLL_DEBUG_INFO     UnloadDll;\n    OUTPUT_DEBUG_STRING_INFO  DebugString;\n    RIP_INFO                  RipInfo;\n  } u;\n} DEBUG_EVENT, *LPDEBUG_EVENT;<\/pre>\n\n\n\n<p>&nbsp;&nbsp; DebugEvent&#8217;in ilk \u00fc\u00e7 alan\u0131 sabit iken, makalemin devam\u0131nda detaylar\u0131na de\u011finece\u011fim union i\u00e7erisinde yer alan struct&#8217;lar ilgili olay bildirimine has bilgiler i\u00e7ermekte ve sadece bu bildirimlerde gelmektedirler. Yukar\u0131daki yap\u0131n\u0131n C# i\u00e7erisine aktar\u0131lm\u0131\u015f hali ise a\u015fa\u011f\u0131da 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=\"\">[StructLayout(LayoutKind.Explicit)]\npublic struct DebugEvent {\n    [FieldOffset(0)]\n    public DebugEventHeader header;\n\n    [FieldOffset(12)]\n    public DebugEventUnion union;\n}\n\n[StructLayout(LayoutKind.Sequential)]\npublic struct DebugEventHeader {\n    public DebugEventCodes dwDebugEventCode;\n    public UInt32 dwProcessId;\n    public UInt32 dwThreadId;\n};\n\n[StructLayout(LayoutKind.Explicit)]\npublic struct DebugEventUnion {\n    [FieldOffset(0)]\n    public CREATE_PROCESS_DEBUG_INFO CreateProcess;\n\n    [FieldOffset(0)]\n    public EXCEPTION_DEBUG_INFO Exception;\n\n    [FieldOffset(0)]\n    public CREATE_THREAD_DEBUG_INFO CreateThread;\n\n    [FieldOffset(0)]\n    public EXIT_THREAD_DEBUG_INFO ExitThread;\n\n    [FieldOffset(0)]\n    public EXIT_PROCESS_DEBUG_INFO ExitProcess;\n\n    [FieldOffset(0)]\n    public LOAD_DLL_DEBUG_INFO LoadDll;\n\n    [FieldOffset(0)]\n    public UNLOAD_DLL_DEBUG_INFO UnloadDll;\n\n    [FieldOffset(0)]\n    public OUTPUT_DEBUG_STRING_INFO OutputDebugString;\n}\n\npublic enum DebugEventCodes {\n    None = 0,\n    EXCEPTION_DEBUG_EVENT = 1,\n    CREATE_THREAD_DEBUG_EVENT = 2,\n    CREATE_PROCESS_DEBUG_EVENT = 3,\n    EXIT_THREAD_DEBUG_EVENT = 4,\n    EXIT_PROCESS_DEBUG_EVENT = 5,\n    LOAD_DLL_DEBUG_EVENT = 6,\n    UNLOAD_DLL_DEBUG_EVENT = 7,\n    OUTPUT_DEBUG_STRING_EVENT = 8,\n    RIP_EVENT = 9,\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Yukar\u0131daki yap\u0131da DebugEvent struct&#8217;\u0131 32bit ve 64bitlik sistemlerde farkl\u0131 offset&#8217;lerden ba\u015flamaktad\u0131r. Bu sebeple debugger uygulamam\u0131z\u0131n hem x86 hem de x64 sistemlerde \u00e7al\u0131\u015fmas\u0131n\u0131 istiyorsak bu ufak farkl\u0131l\u0131\u011f\u0131 g\u00f6z \u00f6n\u00fcne alarak a\u015fa\u011f\u0131daki \u015fekilde ayn\u0131 i\u00e7erik, fakat farkl\u0131 offset adresine olan iki s\u0131n\u0131f olu\u015fturmal\u0131y\u0131z;<\/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.Explicit)]\npublic struct DebugEvent32 {\n    [FieldOffset(0)]\n    public DebugEventHeader header;\n\n    [FieldOffset(12)]\n    public DebugEventUnion union;\n}\n\n[StructLayout(LayoutKind.Explicit)]\npublic struct DebugEvent64 {\n    [FieldOffset(0)]\n    public DebugEventHeader header;\n\n    [FieldOffset(16)]\n    public DebugEventUnion union;\n}<\/pre>\n\n\n\n<p>Debugger&#8217;\u0131m\u0131z ald\u0131\u011f\u0131 bildirimin t\u00fcr\u00fcn\u00fc <strong>dwDebugEventCode<\/strong> parametresi yard\u0131m\u0131yla alg\u0131layabilir ve yine bu bilgiden yararlanarak kendi i\u015f mant\u0131\u011f\u0131n\u0131 olu\u015fturabilir. A\u015fa\u011f\u0131da, en basit haliyle bir debug d\u00f6ng\u00fcs\u00fc kod par\u00e7ac\u0131\u011f\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=\"\">while (izle) {\n    var debugEvent = new DebugEvent();\n\n    var olayBildirildi = WaitForDebugEvent(ref debugEvent, SONSUZ_BEKLEME);\n    if (!olayBildirildi) { continue; }\n\n    var continueStatus = ContinueStatus.DBG_CONTINUE;\n\n    switch (debugEvent.header.dwDebugEventCode) {\n        case DebugEventCodes.EXCEPTION_DEBUG_EVENT:\n            \/\/ Hata bildirim i\u015f mant\u0131\u011f\u0131 kodu\n            continueStatus = HataOlustuIsle(debugEvent);\n            break;\n        case DebugEventCodes.CREATE_THREAD_DEBUG_EVENT:\n            \/\/ \u0130\u015f par\u00e7ac\u0131\u011f\u0131 olu\u015ftu i\u015f mant\u0131\u011f\u0131 kodu\n            continueStatus = IslemParcacigiOlustuIsle(debugEvent);\n            break;\n        case DebugEventCodes.CREATE_PROCESS_DEBUG_EVENT:\n            \/\/ i\u015flem olu\u015ftu i\u015f mant\u0131\u011f\u0131 kodu\n            continueStatus = IslemOlustuIsle(debugEvent);\n            break;\n        case DebugEventCodes.EXIT_THREAD_DEBUG_EVENT:\n            \/\/ i\u015f mant\u0131\u011f\u0131 kodu\n            continueStatus = IsParcacigiSonlandiIsle(debugEvent);\n            break;\n        case DebugEventCodes.EXIT_PROCESS_DEBUG_EVENT:\n            \/\/ i\u015flem sonland\u0131 i\u015f mant\u0131\u011f\u0131 kodu\n            continueStatus = IslemSonlandiIsle(debugEvent);\n            break;\n        case DebugEventCodes.LOAD_DLL_DEBUG_EVENT:\n            \/\/ dll y\u00fcklendi i\u015f mant\u0131\u011f\u0131 kodu\n            continueStatus = DllYuklendiIsle(debugEvent);\n            break;\n        case DebugEventCodes.UNLOAD_DLL_DEBUG_EVENT:\n            \/\/ dll kald\u0131r\u0131ld\u0131 i\u015f mant\u0131\u011f\u0131 kodu\n            continueStatus = DllKaldirildiIsle(debugEvent);\n            break;\n        case DebugEventCodes.OUTPUT_DEBUG_STRING_EVENT:\n            \/\/ debug \u00e7\u0131kt\u0131s\u0131 al\u0131nd\u0131 i\u015f mant\u0131\u011f\u0131 kodu\n            continueStatus = DebugMesajiIsle(debugEvent);\n            break;\n        case DebugEventCodes.RIP_EVENT:\n            \/\/ uygulama beklenmedik \u015fekilde\n            \/\/ sonland\u0131 i\u015f mant\u0131\u011f\u0131 kodu\n            continueStatus = RIPIsle(debugEvent);\n            break;\n    }\n\n    ContinueDebugEvent(debugEvent.header.dwProcessId, debugEvent.header.dwThreadId, continueStatus);\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; A\u015fa\u011f\u0131da, DebugEventCodes enum&#8217;u i\u00e7erisinde yer alan ve bir debug olay bildirimi ile gelebilecek kodlar\u0131 ve a\u00e7\u0131klamalar\u0131n\u0131 a\u015fa\u011f\u0131da bulabilirsiniz;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Enum<\/th><th>De\u011fer<\/th><th>A\u00e7\u0131klama<\/th><\/tr><\/thead><tbody><tr><td>EXCEPTION_DEBUG_EVENT<\/td><td>1<\/td><td>Takip edilen i\u015flem i\u00e7erisinde olu\u015fan bir hatay\u0131 bildirmektedir. Hata bilgisi <strong>EXCEPTION_DEBUG_INFO<\/strong> struct&#8217;\u0131 ile iletilmektedir.<\/td><\/tr><tr><td>CREATE_THREAD_DEBUG_EVENT<\/td><td>2<\/td><td>Takip edilen i\u015flemde yeni bir i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n olu\u015ftu\u011funu bildirmektedir. Olu\u015fturulan i\u015f par\u00e7ac\u0131\u011f\u0131na ait bilgiler ise <strong>CREATE_THREAD_DEBUG_INFO<\/strong> struct&#8217;\u0131 ile iletilmektedir.<\/td><\/tr><tr><td>CREATE_PROCESS_DEBUG_EVENT<\/td><td>3<\/td><td>Takip edilen i\u015flemde yeni bir i\u015flem olu\u015ftu\u011funu bildirmektedir. Olu\u015fturulan i\u015fleme ait bilgiler ise <strong>CREATE_PROCESS_DEBUG_INFO<\/strong> struct&#8217;\u0131 ile iletilmektedir.<\/td><\/tr><tr><td>EXIT_THREAD_DEBUG_EVENT<\/td><td>4<\/td><td>Takip edilen i\u015flemde bir i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n sonland\u0131\u011f\u0131 bildirilmektedir. Sonlanan i\u015f par\u00e7ac\u0131\u011f\u0131na ait bilgiler ise <strong>EXIT_THREAD_DEBUG_INFO<\/strong> struct&#8217;\u0131 ile iletilmektedir.<\/td><\/tr><tr><td>EXIT_PROCESS_DEBUG_EVENT<\/td><td>5<\/td><td>Takip edilen i\u015flemde bir i\u015flemin sonland\u0131\u011f\u0131 bildirilmektedir. Sonlanan i\u015fleme ait bilgiler ise <strong>EXIT_PROCESS_DEBUG_INFO<\/strong> struct&#8217;\u0131 ile iletilmektedir.<\/td><\/tr><tr><td>LOAD_DLL_DEBUG_EVENT<\/td><td>6<\/td><td>Takip edilen i\u015flemin yeni bir dll&#8217;i y\u00fckledi\u011fi bildirilmektedir. Y\u00fcklenen dll&#8217;e ait bilgiler ise <strong>LOAD_DLL_DEBUG_INFO<\/strong> struct&#8217;\u0131 ile iletilmektedir.<\/td><\/tr><tr><td>UNLOAD_DLL_DEBUG_EVENT<\/td><td>7<\/td><td>Takip edilen i\u015flemin mevcut bir dll&#8217;i kald\u0131rd\u0131\u011f\u0131 bildirilmektedir. Kald\u0131r\u0131lan dll&#8217;e ait bilgiler ise <strong>UNLOAD_DLL_DEBUG_INFO<\/strong> struct&#8217;\u0131 ile iletilmektedir.<\/td><\/tr><tr><td>OUTPUT_DEBUG_STRING_EVENT<\/td><td>8<\/td><td>Takip edilen i\u015flem i\u00e7erisinden bir debug mesaj\u0131n\u0131n g\u00f6nderildi\u011fi bildirilmektedir. G\u00f6nderilen debug mesaj\u0131na ait bilgiler ise <strong>OUTPUT_DEBUG_STRING_INFO<\/strong> struct&#8217;\u0131 ile iletilmektedir.<\/td><\/tr><tr><td>RIP_EVENT<\/td><td>9<\/td><td>\u0130\u015flemin takibi s\u0131ras\u0131nda bir sistem hata ay\u0131klama hatas\u0131 (system debugging error, RIP) olu\u015ftu\u011fu bildirilmektedir. Olu\u015fan bu duruma ait bilgiler ise <strong>RIP_INFO<\/strong> struct&#8217;\u0131 ile iletilmektedir.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Debugger&#8217;\u0131n en \u00f6nemli par\u00e7alar\u0131ndan birisi olan debug d\u00f6ng\u00fcs\u00fcn\u00fcn mimarisini yukar\u0131daki ad\u0131mlar\u0131n ard\u0131nda tamamlam\u0131\u015f oluyoruz. Tek makale ile anlat\u0131lmas\u0131 zor olan debugger yaz\u0131l\u0131m\u0131 konusunda, devam makalelerinde gelen olay bildirimlerinde yer alan bilgileri kullanarak y\u00fcklenen dll&#8217;i ad\u0131n\u0131n nas\u0131l bulunabildi\u011fini, debug mesaj\u0131 nas\u0131l g\u00f6sterebilece\u011fimizi ya da hata mesajlar\u0131n\u0131n neler oldu\u011funu anlat\u0131yor olaca\u011f\u0131m.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Yukar\u0131daki s\u00fcre\u00e7lerin kodlanmas\u0131 ard\u0131ndan hata ay\u0131klamak i\u00e7in bir i\u015fleme ba\u011flan\u0131ld\u0131\u011f\u0131nda i\u015fletim sistemi otomatik olarak bir CREATE_PROCESS_DEBUG_EVENT olay bildirimi yapacakt\u0131r. Yap\u0131lan bu olay bildirimi i\u00e7erisinde takip edilen uygulama hakk\u0131nda bilgiler bulunmaktad\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; \u00d6nceki paragrafta bahsetti\u011fime benzer olarak i\u015fletim sistemince bir de hata olay bildirimi yap\u0131lacak ve kodumuzun 10. sat\u0131r\u0131na d\u00fc\u015fmesine neden olacakt\u0131r. Bunun nedeni, i\u015fletim sistemi a\u00e7\u0131s\u0131ndan break point&#8217;lerinde bir hata olarak yorumlanmas\u0131 ve debugger\u0131n bir i\u015fleme ba\u011flanmas\u0131 durumunda i\u015flemin i\u015fleyi\u015finin i\u015fletim sistemince de\u011fi\u015ftirilerek bir break point eklenmesidir. Bu sebeple bir debugger hata ay\u0131klama amac\u0131yla ba\u011fland\u0131\u011f\u0131 i\u015flemden gelen ilk hata mesaj\u0131n\u0131 (<strong>STATUS_BREAKPOINT<\/strong>, <em>0x80000003<\/em>) es ge\u00e7melidir.<\/p>","protected":false},"excerpt":{"rendered":"<p>&nbsp; Hata ay\u0131klama konusunda \u015fimdiye kadar ki payla\u015f\u0131mlar\u0131mda sizlerle birlikte nas\u0131l minidump alabilece\u011fimizi ve ADPlus uygulamas\u0131n\u0131 nas\u0131l kullanabilece\u011fimizi incelemi\u015f, size birinci ve ikinci \u015fans hatalardan bahsetmi\u015ftim. Yaz\u0131lar\u0131m\u0131n devam\u0131nda art\u0131k daha zevkli, daha faydal\u0131 olaca\u011f\u0131na inand\u0131\u011f\u0131m konulara de\u011finmeyi planl\u0131yorum. Hem ilerleyen makalelere bir zemim olu\u015fturmas\u0131, hem de Windows&#8217;un hata ay\u0131klama konusunda bize sunduklar\u0131n\u0131 daha yak\u0131ndan g\u00f6rebilmek&#8230;<\/p>\n<p><a class=\"read-more\" href=\"https:\/\/fatihboy.com\/en\/win32-debugger-yapiyoruz-1\/\">Read More<\/a><\/p>","protected":false},"author":1,"featured_media":33591,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[77,28],"tags":[118],"class_list":["post-8667","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 - 1 - 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-1\/\" \/>\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 - 1 - Fatih Boy\" \/>\n<meta property=\"og:description\" content=\"&nbsp; Hata ay\u0131klama konusunda \u015fimdiye kadar ki payla\u015f\u0131mlar\u0131mda sizlerle birlikte nas\u0131l minidump alabilece\u011fimizi ve ADPlus uygulamas\u0131n\u0131 nas\u0131l kullanabilece\u011fimizi incelemi\u015f, size birinci ve ikinci \u015fans hatalardan bahsetmi\u015ftim. Yaz\u0131lar\u0131m\u0131n devam\u0131nda art\u0131k daha zevkli, daha faydal\u0131 olaca\u011f\u0131na inand\u0131\u011f\u0131m konulara de\u011finmeyi planl\u0131yorum. Hem ilerleyen makalelere bir zemim olu\u015fturmas\u0131, hem de Windows&#8217;un hata ay\u0131klama konusunda bize sunduklar\u0131n\u0131 daha yak\u0131ndan g\u00f6rebilmek...Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihboy.com\/en\/win32-debugger-yapiyoruz-1\/\" \/>\n<meta property=\"og:site_name\" content=\"Fatih Boy\" \/>\n<meta property=\"article:published_time\" content=\"2011-01-26T21:40:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-06-19T07:11:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/construction-tools.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=\"10 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-1\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/\"},\"author\":{\"name\":\"Fatih Boy\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"headline\":\"Win32 Debugger Yap\u0131yoruz &#8211; 1\",\"datePublished\":\"2011-01-26T21:40:00+00:00\",\"dateModified\":\"2021-06-19T07:11:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/\"},\"wordCount\":2282,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/construction-tools.jpg\",\"keywords\":[\"Hata Ayiklama\"],\"articleSection\":[\"C#\",\"T\u00fcrk\u00e7e\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/\",\"url\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/\",\"name\":\"Win32 Debugger Yap\u0131yoruz - 1 - Fatih Boy\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/construction-tools.jpg\",\"datePublished\":\"2011-01-26T21:40:00+00:00\",\"dateModified\":\"2021-06-19T07:11:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#primaryimage\",\"url\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/construction-tools.jpg\",\"contentUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/construction-tools.jpg\",\"width\":1800,\"height\":1199},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fatihboy.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Win32 Debugger Yap\u0131yoruz &#8211; 1\"}]},{\"@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 - 1 - 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-1\/","og_locale":"en_US","og_type":"article","og_title":"Win32 Debugger Yap\u0131yoruz - 1 - Fatih Boy","og_description":"&nbsp; Hata ay\u0131klama konusunda \u015fimdiye kadar ki payla\u015f\u0131mlar\u0131mda sizlerle birlikte nas\u0131l minidump alabilece\u011fimizi ve ADPlus uygulamas\u0131n\u0131 nas\u0131l kullanabilece\u011fimizi incelemi\u015f, size birinci ve ikinci \u015fans hatalardan bahsetmi\u015ftim. Yaz\u0131lar\u0131m\u0131n devam\u0131nda art\u0131k daha zevkli, daha faydal\u0131 olaca\u011f\u0131na inand\u0131\u011f\u0131m konulara de\u011finmeyi planl\u0131yorum. Hem ilerleyen makalelere bir zemim olu\u015fturmas\u0131, hem de Windows&#8217;un hata ay\u0131klama konusunda bize sunduklar\u0131n\u0131 daha yak\u0131ndan g\u00f6rebilmek...Read More","og_url":"https:\/\/fatihboy.com\/en\/win32-debugger-yapiyoruz-1\/","og_site_name":"Fatih Boy","article_published_time":"2011-01-26T21:40:00+00:00","article_modified_time":"2021-06-19T07:11:29+00:00","og_image":[{"width":1800,"height":1199,"url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/construction-tools.jpg","type":"image\/jpeg"}],"author":"Fatih Boy","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Fatih Boy","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#article","isPartOf":{"@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/"},"author":{"name":"Fatih Boy","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"headline":"Win32 Debugger Yap\u0131yoruz &#8211; 1","datePublished":"2011-01-26T21:40:00+00:00","dateModified":"2021-06-19T07:11:29+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/"},"wordCount":2282,"commentCount":1,"publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"image":{"@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/construction-tools.jpg","keywords":["Hata Ayiklama"],"articleSection":["C#","T\u00fcrk\u00e7e"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/","url":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/","name":"Win32 Debugger Yap\u0131yoruz - 1 - Fatih Boy","isPartOf":{"@id":"https:\/\/fatihboy.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#primaryimage"},"image":{"@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/construction-tools.jpg","datePublished":"2011-01-26T21:40:00+00:00","dateModified":"2021-06-19T07:11:29+00:00","breadcrumb":{"@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#primaryimage","url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/construction-tools.jpg","contentUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/01\/construction-tools.jpg","width":1800,"height":1199},{"@type":"BreadcrumbList","@id":"https:\/\/fatihboy.com\/win32-debugger-yapiyoruz-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fatihboy.com\/"},{"@type":"ListItem","position":2,"name":"Win32 Debugger Yap\u0131yoruz &#8211; 1"}]},{"@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\/8667","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=8667"}],"version-history":[{"count":1,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8667\/revisions"}],"predecessor-version":[{"id":33592,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8667\/revisions\/33592"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media\/33591"}],"wp:attachment":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media?parent=8667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/categories?post=8667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/tags?post=8667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}