Debugging 如何调试Fortran代码中的意外跳转
我正在ODE解算器套件中实现事件检测。下面是我目前正在调试的实现中的一段代码,并注意到一个奇怪的行为。一旦根查找例程成功返回根,将执行第一个if块(ROOTFINDING_ERR==0)——第1行到第14行——这是预期的行为。但是,一旦该块完成执行,执行就会意外地跳到对应于(ROOTFINDING_ERR==0)——第20行——和语句事件_OUT(j)=.FALSE的ELSE块的最后一条语句。在第21行执行ENDIF之前执行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
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。我同意您的回答。但在我接受你的建议之前,我会等着看是否有人会给我关于如何调试的进一步建议。谢谢我明白你的意思。我可以将代码简化为这样,并消除我提到的症状。可能问题会以其他形式出现,然后我可以进行调试。