Ejemplo n.º 1
0
// オブジェクト情報を表示する
void DebugPrintObjectInfo(UINT id)
{
    UINT i;
    TRACKING_OBJECT *o;

    // 検索
    o = NULL;
    LockTrackingList();
    {
        for (i = 0; i < TRACKING_NUM_ARRAY; i++)
        {
            if (hashlist[i] != NULL)
            {
                TRACKING_LIST *t = hashlist[i];

                while (true)
                {
                    if (t->Object->Id == id)
                    {
                        o = t->Object;
                        break;
                    }

                    if (t->Next == NULL)
                    {
                        break;
                    }

                    t = t->Next;
                }

                if (o != NULL)
                {
                    break;
                }
            }
        }
    }
    UnlockTrackingList();

    if (o == NULL)
    {
        // ID が発見できなかった
        Print("obj_id %u Not Found.\n\n", id);
        return;
    }

    PrintObjectInfo(o);
    Print("\n");
}
Ejemplo n.º 2
0
// すべてのオブジェクトの表示
void DebugPrintAllObjects()
{
    UINT i;
    LIST *view;

    // リスト作成
    view = NewListFast(SortObjectView);
    LockTrackingList();
    {
        for (i = 0; i < TRACKING_NUM_ARRAY; i++)
        {
            if (hashlist[i] != NULL)
            {
                TRACKING_LIST *t = hashlist[i];

                while (true)
                {
                    Add(view, t->Object);

                    if (t->Next == NULL)
                    {
                        break;
                    }

                    t = t->Next;
                }
            }
        }
    }
    UnlockTrackingList();

    // ソート
    Sort(view);

    // 描画
    for (i = 0; i < LIST_NUM(view); i++)
    {
        TRACKING_OBJECT *o = (TRACKING_OBJECT *)LIST_DATA(view, i);
        PrintObjectList(o);
    }

    // リスト解放
    ReleaseList(view);

    Print("\n");
}
Ejemplo n.º 3
0
// 新しいオブジェクトを追跡リストに入れる
void TrackNewObj(UINT64 addr, char *name, UINT size)
{
    TRACKING_OBJECT *o;
    UINT new_id;
    // 引数チェック
    if (addr == 0 || name == NULL)
    {
        return;
    }

    if (IsMemCheck() == false)
    {
        // リリースモードでは追跡しない
        return;
    }

    if (disable_tracking)
    {
        return;
    }

    // 新しい ID の生成
    OSLock(obj_id_lock);
    {
        new_id = ++obj_id;
    }
    OSUnlock(obj_id_lock);

    o = OSMemoryAlloc(sizeof(TRACKING_OBJECT));
    o->Id = new_id;
    o->Address = addr;
    o->Name = name;
    o->Size = size;
    o->CreatedDate = LocalTime64();
    o->CallStack = WalkDownCallStack(GetCallStack(), 2);

    o->FileName[0] = 0;
    o->LineNumber = 0;

    LockTrackingList();
    {
        InsertTrackingList(o);
    }
    UnlockTrackingList();
}
Ejemplo n.º 4
0
// Put a new object into the tracking list
void TrackNewObj(UINT64 addr, char *name, UINT size)
{
	TRACKING_OBJECT *o;
	UINT new_id;
	// Validate arguments
	if (addr == 0 || name == NULL)
	{
		return;
	}

	if (IsMemCheck() == false)
	{
		// Don't track in the release mode
		return;
	}

	if (disable_tracking)
	{
		return;
	}

	// Generate a new ID
	OSLock(obj_id_lock);
	{
		new_id = ++obj_id;
	}
	OSUnlock(obj_id_lock);

	o = OSMemoryAlloc(sizeof(TRACKING_OBJECT));
	o->Id = new_id;
	o->Address = addr;
	o->Name = name;
	o->Size = size;
	o->CreatedDate = LocalTime64();
	o->CallStack = WalkDownCallStack(GetCallStack(), 2);

	o->FileName[0] = 0;
	o->LineNumber = 0;

	LockTrackingList();
	{
		InsertTrackingList(o);
	}
	UnlockTrackingList();
}
Ejemplo n.º 5
0
// メモリの使用状態を取得する
void GetMemoryStatus(MEMORY_STATUS *status)
{
    UINT i, num, size;
    // 引数チェック
    if (status == NULL)
    {
        return;
    }

    LockTrackingList();
    {
        size = num = 0;

        for (i = 0; i < TRACKING_NUM_ARRAY; i++)
        {
            if (hashlist[i] != NULL)
            {
                TRACKING_LIST *t = hashlist[i];

                while (true)
                {
                    TRACKING_OBJECT *o = t->Object;

                    if (StrCmpi(o->Name, "MEM") == 0)
                    {
                        num++;
                        size += o->Size;
                    }

                    if (t->Next == NULL)
                    {
                        break;
                    }

                    t = t->Next;
                }
            }
        }
    }
    UnlockTrackingList();

    status->MemoryBlocksNum = num;
    status->MemorySize = size;
}
Ejemplo n.º 6
0
// 追跡しているオブジェクトのサイズを変更する
void TrackChangeObjSize(UINT64 addr, UINT size, UINT64 new_addr)
{
    TRACKING_OBJECT *o;
    // 引数チェック
    if (addr == 0)
    {
        return;
    }

    if (IsMemCheck() == false)
    {
        // リリースモードでは追跡しない
        return;
    }

    if (disable_tracking)
    {
        return;
    }

    LockTrackingList();
    {
        o = SearchTrackingList(addr);
        if (o == NULL)
        {
            UnlockTrackingList();
            return;
        }

        DeleteTrackingList(o, false);

        o->Size = size;
        o->Address = new_addr;

        InsertTrackingList(o);
    }
    UnlockTrackingList();
}
Ejemplo n.º 7
0
// Change the size of the object being tracked
void TrackChangeObjSize(UINT64 addr, UINT size, UINT64 new_addr)
{
	TRACKING_OBJECT *o;
	// Validate arguments
	if (addr == 0)
	{
		return;
	}

	if (IsMemCheck() == false)
	{
		// Don't track in the release mode
		return;
	}

	if (disable_tracking)
	{
		return;
	}

	LockTrackingList();
	{
		o = SearchTrackingList(addr);
		if (o == NULL)
		{
			UnlockTrackingList();
			return;
		}

		DeleteTrackingList(o, false);

		o->Size = size;
		o->Address = new_addr;

		InsertTrackingList(o);
	}
	UnlockTrackingList();
}
Ejemplo n.º 8
0
// 追跡リストからオブジェクトを削除する
void TrackDeleteObj(UINT64 addr)
{
    TRACKING_OBJECT *o;
    // 引数チェック
    if (addr == 0)
    {
        return;
    }

    if (IsMemCheck() == false)
    {
        // リリースモードでは追跡しない
        return;
    }

    if (disable_tracking)
    {
        return;
    }

    LockTrackingList();
    {
        o = SearchTrackingList(addr);
        if (o == NULL)
        {
            UnlockTrackingList();

            if (IsDebug())
            {
                printf("TrackDeleteObj: 0x%x is not Object!!\n", (void *)addr);
            }
            return;
        }
        DeleteTrackingList(o, true);
    }
    UnlockTrackingList();
}
Ejemplo n.º 9
0
// Remove the object from the tracking list
void TrackDeleteObj(UINT64 addr)
{
	TRACKING_OBJECT *o;
	// Validate arguments
	if (addr == 0)
	{
		return;
	}

	if (IsMemCheck() == false)
	{
		// Don't track in the release mode
		return;
	}

	if (disable_tracking)
	{
		return;
	}

	LockTrackingList();
	{
		o = SearchTrackingList(addr);
		if (o == NULL)
		{
			UnlockTrackingList();

			if (IsDebug())
			{
				printf("TrackDeleteObj: 0x%x is not Object!!\n", (void *)addr);
			}
			return;
		}
		DeleteTrackingList(o, true);
	}
	UnlockTrackingList();
}