Board logo

Subject: CnDebugViewer 怎么无法捕获 CnDebugger.logMsg输出 ? [Print This Page]

Author: 李啸林    Time: 2012-6-24 17:29     Subject: CnDebugViewer 怎么无法捕获 CnDebugger.logMsg输出 ?

环境: Delphi XE2 + win7 (64位)

在单元中引用 CnDebug 单元,

代码如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
  CnDebugger.StartDebugViewer;
  CnDebugger.LogMsg('aaaa');
  OutputDebugString(PWideChar('xxxxxxxxxxxxxxxx'));
end;


结果, OutputDebugString的输出能够被 CnDebugViewer 捕获,而CnDebugger.LogMsg('aaaa') 却不能, 问题在那里啊 ?
Author: Passion    Time: 2012-6-24 18:25

Log系列方法需要在工程编译条件中定义DEBUG才有效,如果不想修改工程编译选项,可以用Trace系列方法,如TraceMsg。
Author: 李啸林    Time: 2012-6-24 22:24     Subject: 回复 #2 Passion 的帖子

谢谢老大的回复,可用Trace 方法也不行啊。

跟踪了一下,是因为下面这个过程,在我的电脑执行结果为False

function TCnMapFileChannel.CheckReady: Boolean;
begin
  Result := (FMap <> 0) and (FMapHeader <> nil) and (FQueueEvent <> 0);
  if not Result then
  begin
    FMap := OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE, False, PChar(SCnDebugMapName));
    if FMap <> 0 then
    begin
      FMapHeader := MapViewOfFile(FMap, FILE_MAP_READ or FILE_MAP_WRITE, 0, 0, 0);
      if FMapHeader <> nil then
      begin
        FQueueEvent := OpenEvent(EVENT_MODIFY_STATE, False, PChar(SCnDebugQueueEventName));
        if (FQueueEvent <> 0) then
        begin
          UpdateFlush;
          Result := IsInitedFromHeader;
        end;
      end;
    end;
  end
  else // 区域都有效
    Result := PCnMapHeader(FMapHeader)^.MapEnabled = CnDebugMapEnabled;

  if not Result then
    DestroyHandles;
end;

在我的电脑上
   Result := (FMap <> 0) and (FMapHeader <> nil) and (FQueueEvent <> 0);  
    Result 返回值是 False
而且后面的这条语句
  FMap := OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE, False, PChar(SCnDebugMapName));

执行后,FMap 的值为 0 。

因此整个 TCnMapFileChannel.CheckReady 的返回值为 False ,于是后面的GenerateMsgDesc过程就没有执行。

不明白为什么会 打开内存印象文件失败, 原因到那里去查找。
Author: Passion    Time: 2012-6-25 09:21

我们用的是Global前缀,是否权限问题?检查一下返回值看看。




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0