Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 如何调试Fortran代码中的意外跳转_Debugging_Fortran_Gdb_Gfortran_Dr Memory - Fatal编程技术网

Debugging 如何调试Fortran代码中的意外跳转

Debugging 如何调试Fortran代码中的意外跳转,debugging,fortran,gdb,gfortran,dr-memory,Debugging,Fortran,Gdb,Gfortran,Dr Memory,我正在ODE解算器套件中实现事件检测。下面是我目前正在调试的实现中的一段代码,并注意到一个奇怪的行为。一旦根查找例程成功返回根,将执行第一个if块(ROOTFINDING_ERR==0)——第1行到第14行——这是预期的行为。但是,一旦该块完成执行,执行就会意外地跳到对应于(ROOTFINDING_ERR==0)——第20行——和语句事件_OUT(j)=.FALSE的ELSE块的最后一条语句。在第21行执行ENDIF之前执行 1 IF (ROOTFINDING_E

我正在ODE解算器套件中实现事件检测。下面是我目前正在调试的实现中的一段代码,并注意到一个奇怪的行为。一旦根查找例程成功返回根,将执行第一个if块(ROOTFINDING_ERR==0)——第1行到第14行——这是预期的行为。但是,一旦该块完成执行,执行就会意外地跳到对应于(ROOTFINDING_ERR==0)——第20行——和语句事件_OUT(j)=.FALSE的ELSE块的最后一条语句。在第21行执行ENDIF之前执行

               1  IF (ROOTFINDING_ERR == 0) THEN
               2     IF ((ABS(EVENT_TIMES(1, j) - T_STAR) > &
               3          NEARBY_ROOTS_ABSTOL)  &
               4          .AND. (EVENT_ITER < EVENT_ITER_MAX)) THEN
               5        EVENT_TIMES(1, j) = T_STAR
               6        EVENT_TIMES(2, j) = DBLE(j)
               7        EVENT_TEST(j)     = .TRUE.
               8        EVENT_OUT(j)      = .TRUE.
               9     ELSE
              10        EVENT_TIMES(1, j) = T_STAR
              11        EVENT_TIMES(2, j) = DBLE(j)
              12        EVENT_TEST(j) = .FALSE.
              13        EVENT_OUT(j)  = .TRUE.
              14     ENDIF
              15  ELSE
              16     EVENT_TIMES(1, j) = T_STAR
              17     EVENT_TIMES(2, j) = DBLE(j)
              18     ! Dont test this event further
              19     EVENT_TEST(j)     = .FALSE.
              20     EVENT_OUT(j)      = .FALSE.
              21  ENDIF
1如果(ROOTFINDING\u ERR==0),则
2如果((ABS(事件次数(1,j)-T星)>&
3个附近的_根_Absol)&
4.及(EVENT_ITER
我假设这与一些内存访问/分配问题有关,并在可执行文件上运行了DrMemory(像Valgrind这样的工具)。DrMemory确实指定了一些未初始化的读取,我将进一步研究


我想知道从这里到哪里去。我确实使用gdb一步一步地完成了代码,但在隔离DrMemory抱怨的“未初始化读取”时遇到了一些困难。我打开了
-Wall,-Wextra,-fbounds check
等,以确定编译器是否能够捕获它。我还尝试用x32dbg反汇编exe,但调试符号不被读取,因为x32dbg不支持矮人符号。

从显示的代码中,我看不出任何错误原因。因此,我推测这个错误是由我们看不见的东西引起的

现在,接下来的事情并不能解决这个难题,而是试图绕过它

。。。显示的代码可以简化为

EVENT_TIMES(1, j) = T_STAR
EVENT_TIMES(2, j) = DBLE(j)
IF (ROOTFINDING_ERR == 0) THEN
   EVENT_OUT(j)      = .TRUE.
   IF ((ABS(EVENT_TIMES(1, j) - T_STAR) > &
        NEARBY_ROOTS_ABSTOL)  &
        .AND. (EVENT_ITER < EVENT_ITER_MAX)) THEN
      EVENT_TEST(j)     = .TRUE.
   ELSE
      EVENT_TEST(j) = .FALSE.
   ENDIF
ELSE
   ! Dont test this event further
   EVENT_TEST(j)     = .FALSE.
   EVENT_OUT(j)      = .FALSE.
ENDIF
EVENT_TIMES(1,j)=T_星
事件时间(2,j)=DBLE(j)
如果(ROOTFINDING_ERR==0),则
事件输出(j)=真。
如果((ABS(事件次数(1,j)-T星)>&
附近的_根_Absol)&
和(EVENT_ITER
。。。或者更进一步

EVENT_TIMES(1, j) = T_STAR
EVENT_TIMES(2, j) = DBLE(j)
EVENT_OUT(j) = ROOTFINDING_ERR == 0
EVENT_TEST(j)     = ((ROOTFINDING_ERR == 0) .AND. &
                    (ABS(EVENT_TIMES(1, j) - T_STAR) > &
                    NEARBY_ROOTS_ABSTOL)  &
                    .AND. (EVENT_ITER < EVENT_ITER_MAX))              
EVENT_TIMES(1,j)=T_星
事件时间(2,j)=DBLE(j)
事件_OUT(j)=根查找_ERR==0
事件测试(j)=((ROOTFINDING_ERR==0)。以及&
(ABS(事件次数(1,j)-T星)>&
附近的_根_Absol)&
.和(事件ITER
请对所有Fortran问题使用tag。我同意您的回答。但在我接受你的建议之前,我会等着看是否有人会给我关于如何调试的进一步建议。谢谢我明白你的意思。我可以将代码简化为这样,并消除我提到的症状。可能问题会以其他形式出现,然后我可以进行调试。