Пример #1
0
VOID
MmHeapInsertBackTraceEx(
	__in HWND hWnd,
	__in HWND hWndTree,
	__in HTREEITEM hTreeItem
	)
{
	TVITEM tvi = {0};
	PDIALOG_OBJECT Object;
	PMM_FORM_CONTEXT ObjectContext;
	PPF_REPORT_HEAD Report;
	PBTR_STACK_RECORD Record;
	HWND hWndCtrl;
	PBTR_TEXT_TABLE Table;
	PBTR_TEXT_ENTRY Text;
	WCHAR Buffer[MAX_PATH];
	ULONG i;
	LVITEM lvi = {0};
	PBTR_DLL_ENTRY DllEntry;
	PBTR_DLL_FILE DllFile;
    PBTR_LINE_ENTRY Line;
	PBTR_LINE_ENTRY LineEntry;

	//
	// Skip dll entry
	//

	if (TreeView_GetParent(hWndTree, hTreeItem) == TVI_ROOT) {
		return;
	}

	Object = (PDIALOG_OBJECT)SdkGetObject(hWnd);
	ObjectContext = SdkGetContext(Object, MM_FORM_CONTEXT);
	Report = ObjectContext->Head;

	if (!Report) {
		return;
	}

	//
	// Clear old list items
	//

	hWndCtrl = GetDlgItem(hWnd, IDC_LIST_BACKTRACE);
	ListView_DeleteAllItems(hWndCtrl);

	tvi.mask = TVIF_PARAM;
	tvi.hItem = hTreeItem;
	TreeView_GetItem(hWndTree, &tvi);
	
	Record = (PBTR_STACK_RECORD)tvi.lParam;
	ASSERT(Record != NULL);

	Table = (PBTR_TEXT_TABLE)Report->Context;
	if (!Table) {

		PBTR_TEXT_FILE TextFile;
		
		TextFile = (PBTR_TEXT_FILE)((PUCHAR)Report + Report->Streams[STREAM_SYMBOL].Offset);
		Table = ApsBuildSymbolTable(TextFile, 4093);
		Report->Context = (PVOID) Table;
	}

	//
	// Get dll file
	//

	DllFile = (PBTR_DLL_FILE)ApsGetStreamPointer(Report, STREAM_DLL);

	 //
    // N.B. Read source line information
    //

    if (Report->Streams[STREAM_LINE].Offset != 0 && Report->Streams[STREAM_LINE].Length != 0) {
		Line = (PBTR_LINE_ENTRY)((PUCHAR)Report + Report->Streams[STREAM_LINE].Offset);
	} else {
		Line = NULL;
	}    

	for(i = 0; i < Record->Depth; i++) {

		Text = ApsLookupSymbol(Table, (ULONG64)Record->Frame[i]);
		if (!Text) {
            Text = ApsInsertPseudoTextEntry(Table, (ULONG64)Record->Frame[i]);
		}

		//
		// frame number
		//

		lvi.iItem = i;
		lvi.iSubItem = 0;
		lvi.mask = LVIF_TEXT;
		StringCchPrintf(Buffer, MAX_PATH, L"%02u", i);
		lvi.pszText = Buffer;
		ListView_InsertItem(hWndCtrl, &lvi);
		
		//
		// symbol name
		//

		lvi.iItem = i;
		lvi.iSubItem = 1;
		lvi.mask = LVIF_TEXT;
		StringCchPrintf(Buffer, MAX_PATH, L"%S", Text->Text);
		lvi.pszText = Buffer;
		ListView_SetItem(hWndCtrl, &lvi);
		
		//
		// module 
		//

		lvi.iItem = i;
		lvi.iSubItem = 2;
		lvi.mask = LVIF_TEXT;

		DllEntry = ApsGetDllEntryByPc(DllFile, Record->Frame[i]);
		if (DllEntry) {
			ApsGetDllBaseNameById(Report, DllEntry->DllId, Buffer, MAX_PATH);
		} else {
			StringCchCopy(Buffer, MAX_PATH, L"N/A");
		}

		lvi.pszText = Buffer;
		ListView_SetItem(hWndCtrl, &lvi);

		//
		// line information
		//
		
		lvi.iItem = i;
		lvi.iSubItem = 3;
		lvi.mask = LVIF_TEXT;

		if (Text->LineId != -1) {
			ASSERT(Line != NULL);
			LineEntry = Line + Text->LineId;
			StringCchPrintf(Buffer, MAX_PATH, L"%S : %u", LineEntry->File, LineEntry->Line);
			lvi.pszText = Buffer;
		}
		else {
			lvi.pszText = L""; 
		}

		ListView_SetItem(hWndCtrl, &lvi);
	}
}
Пример #2
0
VOID
CpuFuncInsertData(
	__in HWND hWnd,
	__in PPF_REPORT_HEAD Head
	)
{
	LVITEM lvi = {0};
	ULONG i, j;
	ULONG Count;
	WCHAR Buffer[MAX_PATH];
	HWND hWndCtrl;
	PBTR_FUNCTION_ENTRY FuncEntry;
	PBTR_TEXT_TABLE TextTable;
	PBTR_TEXT_FILE TextFile;
	PBTR_TEXT_ENTRY TextEntry;
	PBTR_PC_ENTRY PcEntry;
	PBTR_LINE_ENTRY LineEntry;
	PBTR_LINE_ENTRY Line;
	ULONG Inclusive;
	ULONG Exclusive;
	PWSTR Unicode;
	double Percent;

	hWndCtrl = GetDlgItem(hWnd, IDC_LIST_FUNCTION);
	Count = (ULONG)(Head->Streams[STREAM_FUNCTION].Length / sizeof(BTR_FUNCTION_ENTRY));
	FuncEntry = (PBTR_FUNCTION_ENTRY)((PUCHAR)Head + Head->Streams[STREAM_FUNCTION].Offset);
	PcEntry = (PBTR_PC_ENTRY)((PUCHAR)Head + Head->Streams[STREAM_PC].Offset);
	TextFile = (PBTR_TEXT_FILE)((PUCHAR)Head + Head->Streams[STREAM_SYMBOL].Offset);

    if (Head->Streams[STREAM_LINE].Offset != 0 && Head->Streams[STREAM_LINE].Length != 0) {
		Line = (PBTR_LINE_ENTRY)((PUCHAR)Head + Head->Streams[STREAM_LINE].Offset);
	} else {
		Line = NULL;
	}

	//
	// Total sample count as initial exclusive/inclusive
	//

	ApsGetCpuSampleCounters(Head, &Inclusive, &Exclusive);
	//Inclusive = Exclusive;

	TextTable = ApsBuildSymbolTable(TextFile, 4093);

	for(i = 0, j = 0; i < Count; i++) {
		
		Percent = (FuncEntry->Inclusive * 1.0) / (Inclusive * 1.0);
		if (Percent < CPU_UI_INCLUSIVE_RATIO_THRESHOLD) {
			FuncEntry += 1;
			continue;
		}

		//
		// Symbol name
		//

		lvi.iItem = j;
		lvi.iSubItem = 0;
		lvi.mask = LVIF_TEXT|LVIF_PARAM;
		lvi.lParam = (LPARAM)FuncEntry;

		TextEntry = ApsLookupSymbol(TextTable, FuncEntry->Address);
        ASSERT(TextEntry != NULL);

        StringCchPrintf(Buffer, MAX_PATH, L"%S", TextEntry->Text);
		lvi.pszText = Buffer;
		ListView_InsertItem(hWndCtrl, &lvi);

		//
		// Inclusive
		//

		lvi.iSubItem = 1;
		lvi.mask = LVIF_TEXT;
		StringCchPrintf(Buffer, MAX_PATH, L"%u", FuncEntry->Inclusive);
		lvi.pszText = Buffer;
		ListView_SetItem(hWndCtrl, &lvi);
		
		
		//
		// Inclusive %
		//

		lvi.iSubItem = 2;
		lvi.mask = LVIF_TEXT;
		StringCchPrintf(Buffer, MAX_PATH, L"%.2f", (FuncEntry->Inclusive * 100.0) / (Inclusive * 1.0));
		lvi.pszText = Buffer;
		ListView_SetItem(hWndCtrl, &lvi);
        
        //
		// Exclusive
		//

		lvi.iSubItem = 3;
		lvi.mask = LVIF_TEXT;
		StringCchPrintf(Buffer, MAX_PATH, L"%u", FuncEntry->Exclusive);
		lvi.pszText = Buffer;
		ListView_SetItem(hWndCtrl, &lvi);

		//
		// Exclusive %
		//

		lvi.iSubItem = 4;
		lvi.mask = LVIF_TEXT;
		StringCchPrintf(Buffer, MAX_PATH, L"%.2f", (FuncEntry->Exclusive * 100.0) / (Exclusive * 1.0));
		lvi.pszText = Buffer;
		ListView_SetItem(hWndCtrl, &lvi);

        //
        // Module
        //

        lvi.iSubItem = 5;
		lvi.mask = LVIF_TEXT;

        ApsGetDllBaseNameById(Head, FuncEntry->DllId, Buffer, MAX_PATH);
		lvi.pszText = Buffer;
		ListView_SetItem(hWndCtrl, &lvi);

        //
		// Line
		//

		if (Line != NULL && TextEntry->LineId != -1) {

			ASSERT(Line != NULL);

			LineEntry = Line + TextEntry->LineId;
			StringCchPrintf(Buffer, MAX_PATH, L"%S:%u", LineEntry->File, LineEntry->Line);

			lvi.iSubItem = 6;
			lvi.mask = LVIF_TEXT;
			lvi.pszText = Buffer; 
			ListView_SetItem(hWndCtrl, &lvi);

		} else {

			lvi.iSubItem = 6;
			lvi.mask = LVIF_TEXT;
			lvi.pszText = L""; 
			ListView_SetItem(hWndCtrl, &lvi);
		}

		FuncEntry += 1;
		j += 1;
	}

	ApsDestroySymbolTable(TextTable);

	Unicode = (PWSTR)ApsMalloc(MAX_PATH * 2);
	StringCchPrintf(Unicode, MAX_PATH, L"Total %u Function samples", Count);
	PostMessage(GetParent(hWnd), WM_USER_STATUSBAR, 0, (LPARAM)Unicode);
}
Пример #3
0
LRESULT 
CpuThreadOnItemChanged(
    __in PDIALOG_OBJECT Object,
	__in NMLISTVIEW *lpNmlv
	)
{
    PCPU_THREAD Thread;
    PCPU_THREAD_PC_TABLE PcTable;
    HWND hWndCtrl;
    LVITEM lvi = {0};
	WCHAR Buffer[MAX_PATH];
	PBTR_TEXT_TABLE TextTable;
	PBTR_TEXT_FILE TextFile;
	PBTR_TEXT_ENTRY TextEntry;
	PCPU_THREAD_PC PcEntry;
	ULONG Exclusive;
    PPF_REPORT_HEAD Head;
    PCPU_FORM_CONTEXT Form;
	ULONG i;
    ULONG Number;
	PBTR_LINE_ENTRY Line;
	PBTR_LINE_ENTRY LineEntry;
	PBTR_DLL_FILE DllFile;
	PBTR_DLL_ENTRY DllEntry;
	double Percent;

    Form = (PCPU_FORM_CONTEXT)Object->Context;
    ASSERT(Form != NULL);

    Head = Form->Head;
    ASSERT(Head != NULL);

    if (lpNmlv->uNewState & LVIS_SELECTED) {

        //
        // Delete all items if any
        //

        hWndCtrl = GetDlgItem(Object->hWnd, IDC_LIST_CPU_THREAD_PC);
        ListView_DeleteAllItems(hWndCtrl);

        ASSERT(lpNmlv->lParam != 0);
        Thread = (PCPU_THREAD)lpNmlv->lParam;

        PcTable = Thread->Table;
        ASSERT(PcTable != NULL);

        //
        // Build symbol table to parse PC address 
        //

        TextFile = (PBTR_TEXT_FILE)((PUCHAR)Head + Head->Streams[STREAM_SYMBOL].Offset);
        TextTable = ApsBuildSymbolTable(TextFile, 4093);

        Exclusive = Thread->Exclusive;
        Number = 0;

		DllFile = (PBTR_DLL_FILE)ApsGetStreamPointer(Head, STREAM_DLL);
		DllEntry = &DllFile->Dll[0];

		Line = (PBTR_LINE_ENTRY)ApsGetStreamPointer(Head, STREAM_LINE);
		LineEntry = Line;

        for(i = 0; i < CPU_PC_BUCKET; i++) {

            PLIST_ENTRY ListEntry;
            PLIST_ENTRY ListHead;

            ListHead = &PcTable->ListHead[i];
            ListEntry = ListHead->Flink;

            while (ListEntry != ListHead) {

                PcEntry = CONTAINING_RECORD(ListEntry, CPU_THREAD_PC, ListEntry);

				Percent = (PcEntry->Inclusive * 1.0) / (Exclusive * 1.0);
				if (Percent < CPU_UI_INCLUSIVE_RATIO_THRESHOLD) {
	                ListEntry = ListEntry->Flink;
					continue;
				}

                //
                // Symbol name
                //

                lvi.iItem = Number;
                lvi.iSubItem = 0;
                lvi.mask = LVIF_TEXT|LVIF_PARAM;
                lvi.lParam = (LPARAM)PcEntry;

                ASSERT(PcEntry->Pc != NULL);

                TextEntry = ApsLookupSymbol(TextTable, (ULONG64)PcEntry->Pc);
                if (TextEntry) {
                    StringCchPrintf(Buffer, MAX_PATH, L"%S", TextEntry->Text);
                } else {
                    ApsFormatAddress(Buffer, MAX_PATH, PcEntry->Pc, TRUE);
                }

                lvi.pszText = Buffer;
                ListView_InsertItem(hWndCtrl, &lvi);

                //
                // Inclusive
                //

                lvi.iSubItem = 1;
                lvi.mask = LVIF_TEXT;
                StringCchPrintf(Buffer, MAX_PATH, L"%u", PcEntry->Inclusive);
                lvi.pszText = Buffer;
                ListView_SetItem(hWndCtrl, &lvi);

               
                //
                // Inclusive %
                //

                lvi.iSubItem = 2;
                lvi.mask = LVIF_TEXT;
                StringCchPrintf(Buffer, MAX_PATH, L"%.2f", (PcEntry->Inclusive * 100.0) / (Exclusive * 1.0));
                lvi.pszText = Buffer;
                ListView_SetItem(hWndCtrl, &lvi);
                
                //
                // Exclusive
                //

                lvi.iSubItem = 3;
                lvi.mask = LVIF_TEXT;
                StringCchPrintf(Buffer, MAX_PATH, L"%u", PcEntry->Exclusive);
                lvi.pszText = Buffer;
                ListView_SetItem(hWndCtrl, &lvi);

                //
                // Exclusive %
                //

                lvi.iSubItem = 4;
                lvi.mask = LVIF_TEXT;
                StringCchPrintf(Buffer, MAX_PATH, L"%.2f", (PcEntry->Exclusive * 100.0) / (Exclusive * 1.0));
                lvi.pszText = Buffer;
                ListView_SetItem(hWndCtrl, &lvi);

                //
                // Dll 
                //

                lvi.iSubItem = 5;
                lvi.mask = LVIF_TEXT;
				
				ApsGetDllBaseNameById(Head, PcEntry->DllId, Buffer, MAX_PATH);
                lvi.pszText = Buffer;
                ListView_SetItem(hWndCtrl, &lvi);

				//
				// Line
				//

				if (PcEntry->LineId != -1) {

					ASSERT(Line != NULL);

					LineEntry = Line + PcEntry->LineId;
					StringCchPrintf(Buffer, MAX_PATH, L"%S:%u", LineEntry->File, LineEntry->Line);

					lvi.iSubItem = 6;
					lvi.mask = LVIF_TEXT;
					lvi.pszText = Buffer; 
					ListView_SetItem(hWndCtrl, &lvi);

				} else {

					lvi.iSubItem = 6;
					lvi.mask = LVIF_TEXT;
					lvi.pszText = L""; 
					ListView_SetItem(hWndCtrl, &lvi);
				}

                //
                // Move to next PC
                //

                Number += 1;
                ListEntry = ListEntry->Flink;
            }
        }

        ApsDestroySymbolTable(TextTable);
    }

    return 0L;
}