API отладчика - API отправки команды отладки (QteSubmitDebugCommand) - PullRequest
0 голосов
/ 18 декабря 2018

Просто чтобы уточнить, я нахожусь на V7R3M0.

Я пытаюсь вызвать API Submit Debug Command ( QteSubmitDebugCommand ), но не получаю ожидаемых результатов, или я не получаюне правильно понимаю результаты.Я пытаюсь следовать примеру для заявления 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) выглядит правильно, так как значение Hex для RESULTTYPE равно '02000000'X, которое, я думаю, является BreakR.Но я ожидал, что значение в дампе будет 2, а не 33554432. Может кто-нибудь сказать мне, почему это?Я делаю что-то не так или просто неправильно понимаю, как это отображается.

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

resultArray (3) выглядит некорректно, поскольку значение Hex для 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);  

1 Ответ

0 голосов
/ 19 декабря 2018

Не совсем уверен насчет формата записей массива результатов, но одна вещь в этом 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);
...