windows - Få navn/beskrivelse Startadresse eller fra en tråd i en proces (Delphi/Pascal)

Indlæg af Hanne Mølgaard Plasc

Problem



Process Hacker har en procesleder i C.


Når du dobbeltklikker i procesadministratoren på en proces, f.eks. Explorer

Du kan se en masse oplysninger, herunder:

Emner relateret til processen. PDD, Cycles Delta Start, Adresse, prioritet.


Nå jeg forsøgte at gøre noget lignende i Delphi, men jeg får kun TID og prioritet ...

Jeg kan ikke sætte info Startadresse som følger: 'msiltcfg.dll 0x258!' eller kan kun returnere
00630EFA.


Den (Original) Application Process Hacker viser oplysningerne i billedet nedenfor:


http://i54.tinypic.com/mrcztx.png


Hvordan løser jeg dette? baseret på koden eksempelet nedenfor.


procedure TForm1.Button7Click (Sender: TObject);
var
  tbi: THREAD\_BASIC\_INFORMATION;
  hThreadSnap, Process, hThread, ThreadInfo: THandle;
  te32: tagTHREADENTRY32;
  me32: MODULEENTRY32;
  th32: THREADENTRY32;
  dwPID: DWORD;

  startaddr: Pointer;
  Status: LongInt;
  Error: DWORD;
  modname: String;
  hToken: DWORD;
  TKP: TOKEN\_PRIVILEGES;
  otkp: TOKEN\_PRIVILEGES;
  dwLen: dword;


begin
  hThreadSnap: = CreateToolhelp32Snapshot (TH32CS\_SNAPTHREAD, 0);
  if hThreadSnap = INVALID\_HANDLE\_VALUE then 
   Exit;
  try
    dwPID: = GetProcessID (Trim (Edit1.Text));

    te32.dwSize: = SizeOf (THREADENTRY32);

    me32.dwSize: = SizeOf (MODULEENTRY32);

    ListBox1.Items.Clear;
    ListBox2.Items.Clear;

    if not Thread32First (hThreadSnap, te32) then
      Exit;

    repeat
      if te32.th32OwnerProcessID = dwPID then 
      begin
        hThread: = OpenThread (THREAD\_ALL\_ACCESS,
        False, te32.th32ThreadID);
        status: = ZwQueryInformationThread (hThread,
        9, 
        ThreadQuerySetWin32StartAddress {}
        @Startaddr,
        SizeOf (startaddr)
        @ DwLen);

        listbox1.Items.AddObject (Format ('StartAddress:\% p'
        [Startaddr]) + 'ID:' + IntToStr(te32.th32ThreadID), TObject (hThread));

        if hThread <> 0 then
          CloseHandle (hThread);
      end;
    Until not Thread32Next (hThreadSnap, te32);
  finally
    CloseHandle (hThreadSnap);
  end;
end;

Bedste reference


Se vores logføringsklasse i Open Source SynCommons.pas-enheden: Du kan spore stakken af ​​en hvilken som helst metode i logfilen. Hvis .mappen (eller dens komprimerede .mab-ækvivalens) er tilgængelig, vises linjenummeret. [4]


Jeg arbejder på en logfremviser, der kan føje kildekoden linjer under visning fra en gem.map/.mab fil.


Den bruges nu af enhedens testklasser, så enhver fejl vil skabe en post i loggen med kildelinjen og stakke spor:



  C: \ Dev \ lib \ SQLite3 \ exe \ TestSQL3.exe 0.0.0.0 (2011-04-13)
      Host=Laptop Bruger=MyName CPU=2 * 0-15-1027 OS=2.3=5.1.2600 Wow64=0 Freq=3579545
      TSynLogTest 1.13 2011-04-13 05:40:25

  
  20110413 05402559 fail TTestLowLevelCommon (00B31D70) Lavt niveau fælles: TDynArray '' stakkespor 0002FE0B SynCommons.TDynArray.Init (15148) 00036736 SynCommons.Test64K (18206) 0003682F SynCommons.TTestLowLevelCommon.\_TDynArray (18214) 000E9C94 TestSQL3 (163)



Forskellen mellem en testdragt uden logning (TSynTests) og en testdragt med logging (TSynTestsLogged) er kun dette:


procedure TSynTestsLogged.Failed(const msg: string; aTest: TSynTestCase);
begin
  inherited;
  with TestCase[fCurrentMethod] do begin
    fLogFile.Log(sllFail,'\%: \% "\%"',
      [Ident,TestName[fCurrentMethodIndex],msg],aTest);
  end; {with}
end;


sllFail niveauet, hvis det bruges her, men du kan bruge ethvert tilgængeligt niveau.