调试器API-提交调试命令(QteSubmitDebugCommand)API

时间:2018-12-18 18:11:00

标签: ibm-midrange rpgle

请澄清一下,我使用的是V7R3M0。

我正在尝试调用Submit Debug Command(QteSubmitDebugCommand)API,但未获取我期望的结果,或者我不正确理解结果。我正在尝试遵循BREAK语句的示例(在手册页面底部附近)。我期望显示的结果相似,但结果却不一样。

我的原型是:

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

STRINGSPACE未显示,但看起来确实正确

根据手册,应该重新找回:

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)看起来是正确的。

由于RESULTTYPE的十六进制值为'02000000'X,因此我认为这是BreakR,因此resultArray(1)看起来正确。但是我期望转储中的值为2而不是33554432。有人可以告诉我为什么吗?我是在做错什么还是只是误解了它的显示方式?

resultArray(2)看起来正确,因为RESULTTYPE的十六进制值为'05000000'X,我认为这是BreakPositionR。关于为什么我必须查看十六进制值的问题相同。

由于RESULTTYPE的十六进制值为'05000000'X,因此resultArray(3)看起来不正确,并且手册显示我应该一直期待ExpressionTextR(7)。

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

任何人都可以在我的通话或原型定义中看到我在做什么。

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

任何想法都将不胜感激。

谢谢

Rob

更新: 在Mark的回复之后,我更改了程序以遵循Mark的建议,并且该方法正常工作。谢谢马克。

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

  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);  

1 个答案:

答案 0 :(得分:0)

不确定结果数组条目的格式,但是关于此API的一件事是结果数组的长度可变,并且字符串条目紧随返回的结果数组之后。这意味着,除非在结果数组中确切获得4个条目,否则您将不会在字符串空间变量中得到字符串空间。请注意,如果在结果数组条目4 x'C9C4E740 6E40F200 00404040'中转换十六进制代码,则将有一个空终止的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个具有偏移量和长度的零件条目之一。您应该可以使用类似以下内容的子字符串:

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