首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试器API -提交调试命令(QteSubmitDebugCommand) API

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

Stack Overflow用户
提问于 2018-12-18 18:10:59
回答 1查看 91关注 0票数 0

澄清一下,我上的是V7R3M0。

我试图调用Submit Debug命令(Submit Debug,QteSubmitDebugCommand) API,但没有得到预期的结果,否则我就无法正确理解结果。我试着按照这个例子来做一个page语句(在手册中的页面底部附近)。我期待类似的结果所显示的,但我没有得到相同的结果。

我的原型是:

代码语言:javascript
复制
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;                                       

这些变量的定义如下:

代码语言:javascript
复制
  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:

代码语言:javascript
复制
QteSubmitDebugCommand(receiverVariable :%Len(receiverVariable) :pViewID 
                      :pDebugCommand :%Len(pDebugCommand) :pCompilerID :apiErrDS);

  receiverPtr = %addr(receiverVariable);

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

我在垃圾堆里看到的是:

代码语言:javascript
复制
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,但它看起来是正确的

根据手册应该是回来的:

代码语言:javascript
复制
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)是正确的。

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

resultArray(2)看起来是正确的,因为RESULTTYPE的十六进制值是'05000000'X,我认为这是BreakPositionR。

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

至于字符串空间,我没有看到任何类似于IDX >2的地方,手册显示这是我应该期待的。

有人能看到我在呼叫或原型定义中做错了什么吗?

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

任何想法都将不胜感激。

谢谢,

抢夺

更新:在Mark的回复之后,我改变了程序,以遵循Mark的建议,它正确地工作了。谢谢,马克。

以下是我把代码更改为..。

代码语言:javascript
复制
  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);  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-18 22:02:52

对于结果数组条目的格式不太确定,但是这个API的一件事是结果数组是可变长度的,字符串条目紧跟在返回的结果数组后面。这意味着除非结果数组中有4个条目,否则字符串空间变量中的字符串空间不会结束。请注意,如果您转换结果数组条目4 x'C9C4E740 6E40F200 00404040'中的十六进制代码,则有一个以IDX > 2结尾的空终止的EBCDIC字符串。在第三个结果数组条目之后(因为API告诉您返回了3个条目),这正是它应该出现的地方。API不知道您的RPG字段的格式,您实际上只是提供了一个必须解释的缓冲区。

我通常使用一个基于变量的变量来解释诸如可变长度格式之类的内容。所以在这个例子中,我定义如下:

代码语言:javascript
复制
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关键字。

要处理这一点,您可以这样做:

代码语言:javascript
复制
pResultEntry = %addr(ReceiverData);
for ix = 1 to ReceiverData.entries;
  pResultEntry += 12;
  ProcessResultArrayEntry(resultEntry);
endfor;

但是,正如我前面所说的,我不确定您在结果数组条目3中看到了什么,似乎它应该是具有偏移量和长度的三个部分条目之一。您应该能够使用这样的方法将文本子串出来:

代码语言:javascript
复制
string = %subst(ReceiverData: resultEntry.offset: resultEntry.length);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53838830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档