调试器API-提交debug命令(qtesubmitdebugcommand)API



只是为了澄清,我在V7R3M0上。

我试图调用提交debug命令(qtesubmitdebugcommand)API,但没有回到我期望的结果,或者我不正确理解结果。我正在尝试按照示例进行断点语句(手册中页面底部附近)。我期望与显示的结果相似,但我没有得到相同的结果。

我的原型是:

dcl-pr QteSubmitDebugCommand extproc(*dclcase);
  rcvrDta char(128);                          
  rcvrSiz int(10) const;                      
  viewID int(10) const;                       
  InputBuffer char(64) const;                 
  InpBfrSiz int(10) const;                    
  CompilerID char(20) const;                  
  apiError like(apiErrDs);                    
end-pr;                                       

变量的定义是:

  dcl-pi *n ;
    pViewID int(10) const;
    pDebugCommand varchar(64) const options(*trim);  // This is BREAK 10 WHEN IDX > 2
    pCompilerID char(20) const;   // which is valid in the test harness program
  end-pi;
  dcl-s receiverVariable char(128);
  dcl-s i uns(5);
  dcl-ds apiErrDs likeDs(apiErrDsTmp) inz;
  dcl-ds resultEntryTmp template qualified;
    resultType uns(10);
    count uns(10);
    length uns(10);
  end-ds;
  dcl-s receiverPtr pointer;
  dcl-ds receiverData qualified based(receiverPtr);
    bytesReturned int(10);
    bytesAvailable int(10);
    entries int(10);
    resultArray dim(4) likeds(resultEntryTmp);
    stringSpace char(256);
  end-ds;

我用:

将API称为
QteSubmitDebugCommand(receiverVariable :%Len(receiverVariable) :pViewID 
                      :pDebugCommand :%Len(pDebugCommand) :pCompilerID :apiErrDS);
  receiverPtr = %addr(receiverVariable);

此时,我将程序转储以检查结果。

我在转储中看到的是:

RECEIVERDATA          DS
   BYTESAVAILABLE      INT(10)              57               '00000039'X
   BYTESRETURNED       INT(10)              57               '00000039'X
   ENTRIES             INT(10)              3                '00000003'X
   RESULTARRAY         DS                   DIM(4)
     (1)
       COUNT           UNS(10)              3                '00000003'X
       LENGTH          UNS(10)              0                '00000000'X
       RESULTTYPE      UNS(10)              33554432         '02000000'X
     (2)
       COUNT           UNS(10)              10               '0000000A'X
       LENGTH          UNS(10)              0                '00000000'X
       RESULTTYPE      UNS(10)              83886080         '05000000'X
     (3)
       COUNT           UNS(10)              10               '0000000A'X
       LENGTH          UNS(10)              0                '00000000'X
       RESULTTYPE      UNS(10)              83886080         '05000000'X
     (4)
       COUNT           UNS(10)              1849750016       '6E40F200'X
       LENGTH          UNS(10)              4210752          '00404040'X
       RESULTTYPE      UNS(10)              3385124672       'C9C4E740'X

未显示弦乐空间,但看起来确实正确

根据手册应该返回:

Receiver Variable
Offset       Field                    Value
0            Bytes returned           59
             Bytes available          59
             Entry count              3
12           Result type              BreakR(2)
             Break results count      3
             Reserved
24           Result type              BreakPositionR(5)
             Line number              7 (in my case this = 10)
             Reserved
36           Result type              ExpressionTextR(7)
             Expression text offset   48
             Expression text length   10
48           String space    result > 5

因此看起来像标头记录(偏移0)是正确的。

结果图(1)看起来很正确,因为结果类型的十六进制值为'02000000'x,我认为这是breakr。但是我期望垃圾场中的价值为2不是33554432。有人可以告诉我为什么这是吗?我是在做错事还是只是误解了它的显示方式。

结果图(2)看起来很正确,因为结果类型的十六进制值为'05000000'x,我认为这是breakpositionr。关于为什么我必须查看十六进制值的问题。

结果图(3)看起来不正确,因为结果类型的十六进制值为'05000000'x,并且我应该期望表达式Textr(7)的手册显示。

至于字符串空间,我看不到任何类似IDX> 2的内容,该手册显示我应该期望的。

任何人都可以看到我在电话中或原型定义中所做的错。

另外,有人可以解释为什么resultArray.count看起来像一个正常的int,而resultArray.recordType仅在十六进制中才看起来正确。我应该看十六进制值吗?

任何想法都将不胜感激。

谢谢,

Rob

更新:在马克的答复之后,我更改了遵循马克的建议的过程,并正确起作用。谢谢,马克。

这是我结束将代码更改为...

  dcl-s receiverPtr pointer;
  dcl-ds receiverData qualified based(receiverPtr);
    bytesReturned int(10);
    bytesAvailable int(10);
    entries int(10);
  end-ds;
  dcl-s resultEntryPtr pointer;
  dcl-ds resultEntry qualified based(resultEntryPtr);
    type uns(10) pos(1);
    count uns(10) pos(5);
    offset uns(10) pos(5);
    length uns(10) pos(9);
  end-ds;
  dcl-s stringSpace char(256);

  QteSubmitDebugCommand(receiverVariable :%Len(receiverVariable) :pViewID :pDebugCommand :%Len(pDebugCommand)
                       :pCompilerID :apiErrDS);
    receiverPtr = %addr(receiverVariable);
    resultEntryPtr = %addr(receiverVariable);
    // We want to position the pointer to the last entry which contains
    // the offset and the length of the character string.
    resultEntryPtr += 12 * receiverData.entries;
    stringSpace = %subst(receiverVariable: resultEntry.offset: resultEntry.length);  

对结果数组条目的格式不确定,但是有关此API的一件事是结果数组是可变长度,并且字符串条目立即遵循返回的结果数组。这意味着除非您在结果数组中完全获得4个条目,否则您将不会在字符串空间变量中获得字符串空间。请注意,如果您在结果数组输入4 x'C9C4E740 6E40F200 00404040'中转换十六进制代码,则有一个null终止的EBCDIC字符串,说IDX > 2。这是正确的位置,在第三个结果数组输入之后立即(因为API告诉您返回了3个条目)。API不知道您的RPG字段的格式,您实际上只是提供一个必须解释的缓冲区。

我通常使用基于的变量来解释诸如可变长度格式之类的内容。因此,在这种情况下,我将定义这样的内容:

dcl-ds resultEntry        Qualified Based(pResultEntry);
  type                    Uns(10) Pos(1);
  count                   Uns(10) Pos(5);
  offset                  Uns(10) Pos(5);
  length                  Uns(10) Pos(9);
end-ds;
dcl-s pResultEntry        Pointer;

注意resultEntry.countresultEntry.offset互相覆盖,但如果条目是输入是一个偏移和长度的3型条目,则提供好名称,而不是仅计数的类型2条目。您可以以不同的方式定义此功能,但是关键是数据结构声明行上的Based关键字。

要处理此操作,您可以做这样的事情:

pResultEntry = %addr(ReceiverData);
for ix = 1 to ReceiverData.entries;
  pResultEntry += 12;
  ProcessResultArrayEntry(resultEntry);
endfor;

,但是正如我之前所说的,我不确定您在结果数组条目3中所看到的3。看来,它应该是具有偏移和长度的3个部分条目之一。您应该能够使用类似的内容从文本中划出文本:

string = %subst(ReceiverData: resultEntry.offset: resultEntry.length);

相关内容

  • 没有找到相关文章

最新更新