#database #debugging #ibm-midrange
Вопрос:
Я работаю над попыткой отладить проблему с расчетом процентной ставки, которая выполняется для нескольких тысяч записей из нескольких миллионов в программе RPG в системе AS400. Прямо сейчас очень небольшому числу записей в очень большой таблице присвоены абсурдные процентные значения (многократно превышающие принцип в течение нескольких месяцев).
Я пытался решить эту проблему с помощью встроенного отладчика as400, чтобы определить причину сбоя вычисления путем отладки конкретных записей о проблемах. Однако мне не удалось найти способ прочитать одну из записей о проблеме напрямую или иным образом получить к ней доступ в отладчике (я пытался использовать условные точки останова, однако они неэффективны по времени из-за размера таблицы).
Есть ли способ прямого доступа/чтения определенной записи во время отладки в цикле типа RPG Dow %eof?
Ответ №1:
Есть ли способ прямого доступа/чтения определенной записи во время отладки в цикле типа RPG Dow %eof
Нет. Вам нужно будет использовать CHAIN или SETLL/READE для доступа к определенной записи.
Предполагая, что у вас нет отдельной среды разработки/тестирования…
Без изменения программного кода вы можете создать новую копию таблицы только с проблемными записями. Затем используйте команду Переопределить файл базы данных (OVRDBF), чтобы заставить вашу программу получить доступ к вашей копии таблицы вместо обычной.
Если у вас есть отдельная среда, вы все равно можете сократить данные до проблемных записей.
Комментарии:
1. Спасибо, это кажется хорошим обходным путем
Ответ №2:
запущенная программа может выполнить STRDBG
команду для запуска отладчика на самой себе. Измените программу, чтобы проверить наличие ошибки. Когда это произойдет, вызовите программу QCMDEXC
и выполните STRDBG PgmName updprod(*yes)
команду. Отладчик запускается, код останавливается на инструкции, которая запустила отладчик.
** ---------------------- pr_qcmdexc -------------------------
dpr_qcmdexc pr extpgm('QCMDEXC')
d InCmds 9999a const options(*VarSize)
d InCmdsLx 15p 5 const
** --------------------------- test0246r ---------------------
** test0246r: strdbg when condition in running program.
dtest0246r pi
d vSrcdta s 132a
d vSrcseq s 7p 2
d cmds s 256a varying
/free
exec sql
declare c1 cursor for
select a.srcdta, a.srcseq
from qrpglesrc a ;
exec sql
open c1 ;
dow 1 = 1 ;
exec sql
fetch c1
into :vSrcdta, :vSrcseq ;
if sqlcode <> 0 ;
leave ;
endif ;
// strdbg when seqnbr = 15
if vSrcseq = 15 ;
cmds = 'strdbg test0246r updprod(*yes)' ;
pr_qcmdexc( cmds: %len(cmds)) ;
endif ;
enddo ;
exec sql
close c1 ;
*inlr = '1' ;
return ;
/end-free
Комментарии:
1. Классная идея! Я не знал, что это возможно.