// 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(); }
// 追跡しているオブジェクトのサイズを変更する 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(); }
// オブジェクト情報を表示する 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"); }
// 追跡リストからオブジェクトを削除する 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(); }
// 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(); }
// すべてのオブジェクトの表示 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"); }
// 新しいオブジェクトを追跡リストに入れる 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(); }
// 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(); }
// メモリの使用状態を取得する 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; }