执行过程中的变量更改.C

Variable changes during the execution. C++

本文关键字:变量 过程中 执行      更新时间:2023-10-16

该程序以分段故障崩溃,因此我用GDB运行它。我发现在运行时,班级的成员被覆盖。几个事实:

  • 该类未在覆盖的功能中使用。
  • 被覆盖的代码的一部分在OMP关键部分中。

我检查了调试器停止的行 - 该行中访问的变量具有不同的内存地址。

GDB代码:

(gdb) p SrcVelField
$1 = (SNGM::FieldVector *) 0x555555a237a0
(gdb) p *SrcVelField
$2 = {MeshRef = 0x55555592e530, Values = {data_ = 0x555555a237f0}, NbVar = 3, 
  NbVal = 8820, VarName = {data_ = 0x55555592f000}, 
  FieldName = "VelocityField"}
(gdb) p (*SrcVelField).NbVar
$3 = 3
(gdb) p &(*SrcVelField).NbVar
$4 = (unsigned int *) 0x555555a237b0
(gdb) watch -l *0x555555a237b0
Hardware watchpoint 2: -location *0x555555a237b0
(gdb) cont
Thread 1 "SNGM" hit Hardware watchpoint 2: -location *0x555555a237b0
Old value = 3
New value = -118991381
SNGM::GlobalEval<SNGM::FilterGaussian, 3u, 1u>::PerformGlobalEval ()
at ../SNGM/Numerics/GlobalEval.cpp:288
288   for (unsigned ii =     0; ii < nx; ii++){
(gdb) p &ii
$5 = (unsigned int *) 0x7fffffffc93c
(gdb) p &nx
$6 = (const unsigned int *) 0x7fffffffc950

我会很高兴提示为什么(*SrcVelField).NbVar的价值在那里变化。

更新在此行中拆卸代码下一步: - 有问题的rax值

(gdb) info registers
rax            0x555555a237b0   93824997275568
rbx            0x61a8   25000

和达到它的说明

280                                     delete[] point;
0x0000555555595bcc <+1113>:  cmpq   $0x0,-0x58(%rbp)
0x0000555555595bd1 <+1118>:  je     0x555555595adc 
<PerformGlobalEvalEv._omp_fn.0(void)+873>
0x0000555555595bd7 <+1124>:  mov    -0x58(%rbp),%rax
0x0000555555595bdb <+1128>:  mov    %rax,%rdi
0x0000555555595bde <+1131>:  callq  0x555555564758
0x0000555555595be3 <+1136>:  jmpq   0x555555595adc 
<PerformGlobalEvalEv._omp_fn.0(void)+873>
281                             } //End for all particles
282
283     #pragma omp critical
   0x0000555555595f5b <+2024>:  callq  0x555555564ae8
   0x0000555555595f78 <+2053>:  callq  0x555555564a40
284                             {
285
286                                     for (unsigned kk = 0; kk < nz; kk++){
   0x0000555555595f60 <+2029>:  movl   $0x0,-0x15c(%rbp)
   0x0000555555595f6a <+2039>:  mov    -0x15c(%rbp),%eax
   0x0000555555595f70 <+2045>:  cmp    -0x148(%rbp),%eax
   0x0000555555595f76 <+2051>:  jb     0x555555595fed 

<PerformGlobalEvalEv._omp_fn.0(void)+2170>
   0x0000555555596005 <+2194>:  addl   $0x1,-0x15c(%rbp)
   0x000055555559600c <+2201>:  jmpq   0x555555595f6a 
<PerformGlobalEvalEv._omp_fn.0(void)+2039>
287                                             for (unsigned jj = 0; jj < ny; jj++){
   0x0000555555595fed <+2170>:  movl   $0x0,-0x158(%rbp)
   0x0000555555595ff7 <+2180>:  mov    -0x158(%rbp),%eax
   0x0000555555595ffd <+2186>:  cmp    -0x144(%rbp),%eax
   0x0000555555596003 <+2192>:  jb     0x555555596011 
<PerformGlobalEvalEv._omp_fn.0(void)+2206>
   0x0000555555596029 <+2230>:  addl   $0x1,-0x158(%rbp)
   0x0000555555596030 <+2237>:  jmp    0x555555595ff7 
<PerformGlobalEvalEv._omp_fn.0(void)+2180>
288                                                     for (unsigned ii = 0; ii < nx; ii++){
   0x0000555555596011 <+2206>:  movl   $0x0,-0x154(%rbp)
   0x000055555559601b <+2216>:  mov    -0x154(%rbp),%eax
   0x0000555555596021 <+2222>:  cmp    -0x140(%rbp),%eax
   0x0000555555596027 <+2228>:  jb     0x555555596032 
<PerformGlobalEvalEv._omp_fn.0(void)+2239>
=> 0x0000555555596177 <+2564>:  addl   $0x1,-0x154(%rbp)

这是常见的行为,当堆叠/堆大小或从界限索引数数时。检查您的堆栈和堆尺寸,并验证您的堆栈尺寸不超过它们。然后检查所有数组/列表的实例,并验证它们是否受到防止错误错误的保护。