API отладчика - API отправки команды отладки (QteSubmitDebugCommand)

Чтобы уточнить, я использую V7R3M0.

Я пытаюсь вызвать команду отправки отладки (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) верна.

ResultArray (1) выглядит правильно, поскольку шестнадцатеричное значение RESULTTYPE равно '02000000'X, что, как мне кажется, является BreakR. Но я ожидал, что значение в дампе будет 2, а не 33554432. Может кто-нибудь сказать мне, почему это так? Я что-то делаю не так или просто не понимаю, как это отображается?

ResultArray (2) выглядит правильно, поскольку шестнадцатеричное значение RESULTTYPE равно '05000000'X, что, как мне кажется, является BreakPositionR. Тот же вопрос, почему я должен смотреть на значение Hex.

ResultArray (3) выглядит некорректно, поскольку шестнадцатеричное значение RESULTTYPE равно '05000000'X, и в руководстве показано, что я должен был ожидать ExpressionTextR (7).

Что касается строкового пространства, я не вижу ничего похожего на IDX> 2, чего, как показывает руководство, я должен ожидать.

Может ли кто-нибудь увидеть, что я делаю не так в моем звонке или в определении прототипа.

Кроме того, может кто-нибудь объяснить, почему resultarray.count выглядит как обычный int, но resultarray.recordtype отображается правильно только в Hex. Стоит ли мне смотреть на значение Hex?

Приветствуются любые мысли.

Спасибо,

Роб

Обновление. После ответа Марка я изменил процедуру, следуя совету Марка, и она сработала правильно. Спасибо, Марк.

Вот что я закончил с изменением кода на ...

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

person Robert Rogerson    schedule 18.12.2018    source источник


Ответы (1)


Не совсем уверен в формате записей массива результатов, но одна особенность этого 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.count и resultEntry.offset накладываются друг на друга, но дают хорошие имена в случае, если запись является записью типа 3 со смещением и длиной, а не записью типа 2 со счетчиком. Вы можете определить это по-другому, но ключевым является ключевое слово Based в строке объявления структуры данных.

Чтобы обработать это, вы можете сделать что-то вроде этого:

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

Но, как я сказал ранее, я не уверен, что вы видите в записи массива результатов 3. Похоже, что это должна быть одна из этих трех частей со смещением и длиной. У вас должна получиться подстрока текста из этого, используя что-то вроде этого:

string = %subst(ReceiverData: resultEntry.offset: resultEntry.length);
person jmarkmurphy    schedule 18.12.2018