📄 form1.cs
字号:
/*****************************************************************************/
/*
XMEM Browser for extended C/C++ Dynamic Memory Control And Debug Library
Copyright (C) Juergen Mueller (J.M.) 1987-2008
All rights reserved.
You are expressly prohibited from selling this software in any form
or removing this notice.
THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, THE
IMPLIED WARRANTIES OF MERCHANTIBILITY, FITNESS FOR A PARTICULAR
PURPOSE, OR NON-INFRINGEMENT. THE AUTHOR SHALL NOT BE LIABLE FOR
ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. THE ENTIRE RISK
AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM AND DOCUMENTATION
IS WITH YOU.
Permission to modify the code and to distribute modified code is granted,
provided the above notices are retained, and a notice that the code was
modified is included with the above copyright notice.
written by: Juergen Mueller, D-70806 Kornwestheim, GERMANY
FILE : XMEMBrowser
REVISION : 20-May-2008
21:05:57
*/
/*****************************************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace XMEMBrowser
{
public partial class Form1 : Form
{
private const int XMEM_MSG_COUNTERS = 1;
private const int XMEM_MSG_STATS = 2;
private const int XMEM_MSG_TEXT = 3;
private const int XMEM_MSG_LOG = 4;
// The WM_COPYDATA constant.
private const int WM_COPYDATA = 0x4A;
// The struct used to marshal data between applications using the windows messaging API.
[StructLayout(LayoutKind.Sequential)]
private struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}
private COPYDATASTRUCT dataStruct;
[StructLayout(LayoutKind.Sequential)]
private struct S_COUNTERS
{
public uint sum_progmem; /* overall # of bytes allocated */
public uint act_progmem; /* actual # of bytes allocated */
public uint total_progmem; /* maximum # of bytes allocated from program */
public uint total_memory; /* total # of bytes allocated */
public uint total_alloc; /* # of alloc, program + memcontrol */
public uint total_progalloc; /* # of alloc from program, done */
public uint total_alloc_call; /* # of alloc calls from program */
public uint total_realloc_call; /* # of alloc calls from program */
public uint total_expand_call; /* # of alloc calls from program */
public uint total_free; /* # of free, program + memcontrol */
public uint total_progfree; /* # of free from program, done */
public uint total_free_call; /* # of free calls from program */
public uint total_realloc_NULL; /* # of realloc calls with NULL */
public uint total_expand_NULL; /* # of _expand calls with NULL */
public uint malloc_call;
public uint calloc_call;
public uint realloc_call;
public uint expand_call;
public uint alloca_call;
public uint free_call;
public uint new_call;
public uint new_array_call;
public uint delete_call;
public uint delete_array_call;
public uint strdup_call;
}
private S_COUNTERS s_counters_Struct;
private const int STATSLOTS = 13; /* number of elements in S_STATS */
[StructLayout(LayoutKind.Sequential)]
private struct S_STATS
{
public uint s_0;
public uint s_1;
public uint s_6;
public uint s_11;
public uint s_51;
public uint s_101;
public uint s_501;
public uint s_1001;
public uint s_5001;
public uint s_10001;
public uint s_50001;
public uint s_100001;
public uint s_500001;
public uint s_1000001;
}
private S_STATS s_stats_Struct;
private const int LIMIT_MESSAGE_INFO = 10000;
private int limit_message_info = LIMIT_MESSAGE_INFO;
private int new_limit_message_info = LIMIT_MESSAGE_INFO;
private const int LIMIT_LOG_INFO = 10000;
private int limit_log_info = LIMIT_LOG_INFO;
private int new_limit_log_info = LIMIT_LOG_INFO;
private uint count_call_stats = 0;
private uint count_size_stats = 0;
private uint count_message = 0;
private uint count_log = 0;
private string received_messages;
private char[] delimiters1 = { '\n' };
private char[] delimiters2 = { ',', '\n' };
private bool process_message_info = true;
private bool process_log_info = true;
private bool process_call_info = true;
private bool process_size_info = true;
private bool process_all_info = true;
public Form1()
{
InitializeComponent();
checkBoxProcessMessageInfo.Checked = process_message_info;
checkBoxProcessLogInfo.Checked = process_log_info;
checkBoxProcessCallInfo.Checked = process_log_info;
checkBoxProcessSizeInfo.Checked = process_size_info;
checkBoxProcessAllInfo.Checked = process_all_info;
textBoxMaxMessageCount.Text = limit_message_info.ToString();
textBoxActualMaxMessageCount.Text = new_limit_message_info.ToString();
textBoxMaxLogCount.Text = limit_log_info.ToString();
textBoxActualMaxLogCount.Text = new_limit_log_info.ToString();
received_messages_info();
MainMenu mainMenu = new MainMenu();
MenuItem menuItemAbout = new MenuItem();
menuItemAbout.Text = "About";
menuItemAbout.Click += new System.EventHandler(this.menuItemAbout_Click);
mainMenu.MenuItems.Add(menuItemAbout);
Menu = mainMenu;
}
protected override void WndProc(ref Message message)
{
if (message.Msg == WM_COPYDATA)
{
// copy the Windows Message WM_COPYDATA data exchange structure
dataStruct = (COPYDATASTRUCT)Marshal.PtrToStructure(message.LParam, typeof(COPYDATASTRUCT));
int msg_id = (int)(dataStruct.dwData);
switch(msg_id)
{
case XMEM_MSG_COUNTERS:
{
++count_call_stats;
if (process_call_info == false)
{
break;
}
s_counters_Struct = (S_COUNTERS)Marshal.PtrToStructure(dataStruct.lpData, typeof(S_COUNTERS));
sum_progmem.Text = s_counters_Struct.sum_progmem.ToString();
act_progmem.Text = s_counters_Struct.act_progmem.ToString();
total_progmem.Text = s_counters_Struct.total_progmem.ToString();
total_memory.Text = s_counters_Struct.total_memory.ToString();
total_alloc.Text = s_counters_Struct.total_alloc.ToString();
total_progalloc.Text = s_counters_Struct.total_progalloc.ToString();
total_alloc_call.Text = s_counters_Struct.total_alloc_call.ToString();
total_realloc_call.Text = s_counters_Struct.total_realloc_call.ToString();
total_expand_call.Text = s_counters_Struct.total_expand_call.ToString();
total_free.Text = s_counters_Struct.total_free.ToString();
total_progfree.Text = s_counters_Struct.total_progfree.ToString();
total_free_call.Text = s_counters_Struct.total_free_call.ToString();
total_realloc_NULL.Text = s_counters_Struct.total_realloc_NULL.ToString();
total_expand_NULL.Text = s_counters_Struct.total_expand_NULL.ToString();
malloc_call.Text = s_counters_Struct.malloc_call.ToString();
calloc_call.Text = s_counters_Struct.calloc_call.ToString();
realloc_call.Text = s_counters_Struct.realloc_call.ToString();
expand_call.Text = s_counters_Struct.expand_call.ToString();
alloca_call.Text = s_counters_Struct.alloca_call.ToString();
free_call.Text = s_counters_Struct.free_call.ToString();
new_call.Text = s_counters_Struct.new_call.ToString();
new_array_call.Text = s_counters_Struct.new_array_call.ToString();
delete_call.Text = s_counters_Struct.delete_call.ToString();
delete_array_call.Text = s_counters_Struct.delete_array_call.ToString();
strdup_call.Text = s_counters_Struct.strdup_call.ToString();
received_messages_info();
break;
}
case XMEM_MSG_STATS:
{
++count_size_stats;
if (process_size_info == false)
{
break;
}
uint total = 0;
s_stats_Struct = (S_STATS)Marshal.PtrToStructure(dataStruct.lpData, typeof(S_STATS));
size_0.Text = s_stats_Struct.s_0.ToString();
total += s_stats_Struct.s_0;
size_1.Text = s_stats_Struct.s_1.ToString();
total += s_stats_Struct.s_1;
size_6.Text = s_stats_Struct.s_6.ToString();
total += s_stats_Struct.s_6;
size_11.Text = s_stats_Struct.s_11.ToString();
total += s_stats_Struct.s_11;
size_51.Text = s_stats_Struct.s_51.ToString();
total += s_stats_Struct.s_51;
size_101.Text = s_stats_Struct.s_101.ToString();
total += s_stats_Struct.s_101;
size_501.Text = s_stats_Struct.s_501.ToString();
total += s_stats_Struct.s_501;
size_1001.Text = s_stats_Struct.s_1001.ToString();
total += s_stats_Struct.s_1001;
size_5001.Text = s_stats_Struct.s_5001.ToString();
total += s_stats_Struct.s_5001;
size_10001.Text = s_stats_Struct.s_10001.ToString();
total += s_stats_Struct.s_10001;
size_50001.Text = s_stats_Struct.s_50001.ToString();
total += s_stats_Struct.s_50001;
size_100001.Text = s_stats_Struct.s_100001.ToString();
total += s_stats_Struct.s_100001;
size_500001.Text = s_stats_Struct.s_500001.ToString();
total += s_stats_Struct.s_500001;
size_1000001.Text = s_stats_Struct.s_1000001.ToString();
total += s_stats_Struct.s_1000001;
if (total == 0)
{
total = 1;
}
double value;
value = s_stats_Struct.s_0 * 100.0 / (double)total;
proz_0.Text = value.ToString("0.00");
progressBar_0.Value = (int)value;
value = s_stats_Struct.s_1 * 100.0 / (double)total;
proz_1.Text = value.ToString("0.00");
progressBar_1.Value = (int)value;
value = s_stats_Struct.s_6 * 100.0 / (double)total;
proz_6.Text = value.ToString("0.00");
progressBar_6.Value = (int)value;
value = s_stats_Struct.s_11 * 100.0 / (double)total;
proz_11.Text = value.ToString("0.00");
progressBar_11.Value = (int)value;
value = s_stats_Struct.s_51 * 100.0 / (double)total;
proz_51.Text = value.ToString("0.00");
progressBar_51.Value = (int)value;
value = s_stats_Struct.s_101 * 100.0 / (double)total;
proz_101.Text = value.ToString("0.00");
progressBar_101.Value = (int)value;
value = s_stats_Struct.s_501 * 100.0 / (double)total;
proz_501.Text = value.ToString("0.00");
progressBar_501.Value = (int)value;
value = s_stats_Struct.s_1001 * 100.0 / (double)total;
proz_1001.Text = value.ToString("0.00");
progressBar_1001.Value = (int)value;
value = s_stats_Struct.s_5001 * 100.0 / (double)total;
proz_5001.Text = value.ToString("0.00");
progressBar_5001.Value = (int)value;
value = s_stats_Struct.s_10001 * 100.0 / (double)total;
proz_10001.Text = value.ToString("0.00");
progressBar_10001.Value = (int)value;
value = s_stats_Struct.s_50001 * 100.0 / (double)total;
proz_50001.Text = value.ToString("0.00");
progressBar_50001.Value = (int)value;
value = s_stats_Struct.s_100001 * 100.0 / (double)total;
proz_100001.Text = value.ToString("0.00");
progressBar_100001.Value = (int)value;
value = s_stats_Struct.s_500001 * 100.0 / (double)total;
proz_500001.Text = value.ToString("0.00");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -