执行过程中的变量更改.C
Variable changes during the execution. C++
该程序以分段故障崩溃,因此我用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)
这是常见的行为,当堆叠/堆大小或从界限索引数数时。检查您的堆栈和堆尺寸,并验证您的堆栈尺寸不超过它们。然后检查所有数组/列表的实例,并验证它们是否受到防止错误错误的保护。
相关文章:
- 是否删除在对象构造过程中创建的对象
- 如何在鼠标挂钩过程中检测拖动
- clang 插件:在编译过程中修改 AST
- 变量名称中的北欧字符C++
- 在变量声明中使用 for 循环
- Adafruit 羽毛RFM69HCW在使用过程中会冻结,需要硬重置
- 变量名称中的大括号
- 线程过程中的线程同步问题
- MySQL 连接器/C++.尝试在此过程中停止连接到数据库
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- c++ 使用 CRTP 为变量模板中的每个类型创建纯虚拟重载
- C++ 列表中的对象变量在迭代过程中不会更新
- 在模拟过程中更改FMI变量/功能
- 执行过程中的变量更改.C
- 在代码优化过程中,C++11编译器是否会在可能的情况下将局部变量转换为右值
- 为visual studio 2010定义环境变量,以便在生成过程中使用
- 变量的地址在执行过程中可以更改吗?
- 如何在代码生成过程中简化包含变量的c风格算术表达式
- 如何确保在优化过程中不删除局部变量
- 为什么SQL服务器将值传递给存储过程中的OUTPUT变量?