Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 获取名称/描述Startaddress或进程中的线程(Delphi/Pascal)_Windows_Delphi_Winapi - Fatal编程技术网

Windows 获取名称/描述Startaddress或进程中的线程(Delphi/Pascal)

Windows 获取名称/描述Startaddress或进程中的线程(Delphi/Pascal),windows,delphi,winapi,Windows,Delphi,Winapi,Process Hacker在C中有一个流程管理器 在流程管理器中双击流程时,例如资源管理器 您会看到很多信息,包括: 与流程相关的主题。PDD,周期增量开始,地址,优先级 我尝试在Delphi中做类似的事情,但我只得到TID和优先级… 我无法将信息的起始地址设置为:“msilcfg.dll 0x258!”或只能返回 00630EFA (原始)应用程序进程黑客在下图中显示信息: 我如何解决这个问题?基于下面的代码示例 procedure TForm1.Button7Click (Sender:

Process Hacker在C中有一个流程管理器

在流程管理器中双击流程时,例如资源管理器
您会看到很多信息,包括:
与流程相关的主题。PDD,周期增量开始,地址,优先级

我尝试在Delphi中做类似的事情,但我只得到TID和优先级…
我无法将信息的起始地址设置为:“msilcfg.dll 0x258!”或只能返回 00630EFA

(原始)应用程序进程黑客在下图中显示信息:

我如何解决这个问题?基于下面的代码示例

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;
程序TForm1.button7点击(发送方:TObject);
变量
tbi:线程基本信息;
hThreadSnap,Process,hThread,ThreadInfo:THandle;
te32:tagTHREADENTRY32;
me32:MODULEENTRY32;
th32:THREADENTRY32;
dwPID:DWORD;
startaddr:指针;
状态:LongInt;
错误:德沃德;
modname:String;
赫托肯:德沃德;
TKP:TOKEN_特权;
otkp:令牌特权;
德伦:德沃德;
开始
hThreadSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
如果hThreadSnap=无效的\u句柄\u值,则
出口
尝试
dwPID:=GetProcessID(Trim(Edit1.Text));
te32.dwSize:=SizeOf(THREADENTRY32);
me32.dwSize:=SizeOf(MODULEENTRY32);
ListBox1.Items.Clear;
ListBox2.Items.Clear;
如果不是thread32优先(hThreadSnap,te32),则
出口
重复
如果te32.th32OwnerProcessID=dwPID,则
开始
hThread:=OpenThread(线程所有访问,
False,te32.th32ThreadID);
状态:=ZwQueryInformationThread(hThread,
9, 
ThreadQuerySewin32StartAddress{}
@Startaddr,
SizeOf(startaddr)
@德伦);
listbox1.Items.AddObject(格式('StartAddress:%p'
[Startaddr]+'ID:'+IntToStr(te32.th32ThreadID),TObject(hThread));
如果hThread为0,则
CloseHandle(hThread);
结束;
直到不是Thread32Next(hThreadSnap,te32);
最后
闭合手柄(hThreadSnap);
结束;
结束;

查看单元中的日志类:您可以将任何方法的堆栈跟踪到日志文件中。如果.map(或其压缩的.mab等价物)可用,将显示行号

我正在使用一个日志查看器,它能够在查看过程中从save.map/.mab文件添加源代码行

单元测试类现在使用它,因此任何故障都会在日志中创建一个条目,其中包含源代码行和堆栈跟踪:

C:\Dev\lib\SQLite3\exe\TestSQL3.exe 0.0.0.0(2011-04-13) 主机=笔记本电脑用户=MyName CPU=2*0-15-1027操作系统=2.3=5.1.2600 Wow64=0频率=3579545 TSynLogTest 1.13 2011-04-13 05:40:25

20110413 05402559失败TTESTLOWLEVELCOMON(00B31D70)低级别公用:TDYNARRY“”堆栈跟踪0002FE0B SYNCOMONS.TDYNARRY.Init(15148)00036736 SYNCOMONS.Test64K(18206)0003682F SYNCOMONS.TTESTLOWLEVELCOMON.\u TDYNARRY(18214)000E9C94 TestSQL3(163)

没有日志记录的测试套件(TsyntTests)和有日志记录的测试套件(TsyntTestSloged)之间的区别仅在于:

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
级别,如果在这里使用,但您可以使用任何可用级别。

我删除了您的电子邮件地址,这些地址的答案如下。我认为您真正的问题应该更像这样:“如何对已经运行的进程中的特定线程进行堆栈回溯,或将函数名与其地址关联”。我猜答案是,除非你有一个链接了调试符号的应用程序,或者有一个外部的.MAP或.TDS文件,否则你不能。Process Hacker是开源的,所以你为什么不看看源代码?@johnny,请不要修复有问题的代码。如果有问题,没有人会知道,每个人都会感到困惑。这个过程是开源黑客耶。。。但是是用C或C完成的。Delphi/Pascal的实现,基于上面我需要的代码。如果可能的话,我会得到你的帮助。该链接显示了图片和红色框中选择的信息,他们需要得到这个代码。我不明白!作为基本模型代码,可以发布为实现此。。甚至不知道从哪里开始,请帮忙me@wederfs字体A Bouchez说他的产品是开源的。这意味着有Delphi代码可供使用。你可以用它来看看怎么做。你必须自己做一些工作(即使别人给你源代码)。这个过程是开源的黑客耶。。。但是是用C或C完成的。Delphi/Pascal的实现,基于上面我需要的代码。如果可能的话,我会得到你的帮助。链接显示了图像,红色框被选中了获取此代码所需的信息这段代码我花了数周的时间阅读了大量代码以获得该结果,但我无法在许多方面获得精确的结果。因此,我认识了你们,我当然更了解你们。我在Delphi编程3年。If可以补充和解释其余的代码,这样我就可以学习了,也要感谢他们的合作伙伴。@wederfs正如我的帖子所说,所有的日志记录都是在syncomns.pas单元的TSynLog类中完成的,它可以从我们的网站下载最新版本,是纯Delphi代码,从Delphi 6一直工作到XE。没有C#,C只是用来编译SQlite3引擎,这里不需要。