// 現在のコールスタックの取得 CALLSTACK_DATA *GetCallStack() { CALLSTACK_DATA *s; if (do_not_get_callstack) { // コールスタックは取得しない return NULL; } OSLock(cs_lock); { // コールスタックの取得 s = OSGetCallStack(); } OSUnlock(cs_lock); if (s == NULL) { return NULL; } // コールスタックを 3 つ分だけ下降する s = WalkDownCallStack(s, 3); return s; }
// Get the current call stack CALLSTACK_DATA *GetCallStack() { CALLSTACK_DATA *s; if (do_not_get_callstack) { // Not to get the call stack return NULL; } OSLock(cs_lock); { // Get the call stack s = OSGetCallStack(); } OSUnlock(cs_lock); if (s == NULL) { return NULL; } // Descend in the call stack for 3 steps s = WalkDownCallStack(s, 3); return s; }
// 新しいオブジェクトを追跡リストに入れる 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(); }