返回信息流407c70: 41 57 push %r15
407c72: 49 89 ff mov %rdi,%r15
407c75: 41 56 push %r14
407c77: 45 31 f6 xor %r14d,%r14d
407c7a: 41 55 push %r13
407c7c: 41 89 d5 mov %edx,%r13d
407c7f: 41 54 push %r12
407c81: 55 push %rbp
407c82: 53 push %rbx
407c83: 48 83 ec 08 sub $0x8,%rsp
407c87: 89 74 24 04 mov %esi,0x4(%rsp)
407c8b: e8 b0 f9 ff ff callq 407640 <_ZN12DynamicGraph7getNodeEj>
407c90: 48 8b 68 08 mov 0x8(%rax),%rbp
407c94: 4c 8d 60 08 lea 0x8(%rax),%r12
407c98: 49 39 6c 24 08 cmp %rbp,0x8(%r12)
407c9d: 74 32 je 407cd1 <_ZN12DynamicGraph12removeAedgesEjj+0x61>
407c9f: 8b 75 00 mov 0x0(%rbp),%esi
407ca2: 4c 89 ff mov %r15,%rdi
407ca5: e8 26 f9 ff ff callq 4075d0 <_ZN12DynamicGraph7getEdgeEj>
407caa: 48 85 c0 test %rax,%rax
407cad: 48 89 c3 mov %rax,%rbx
407cb0: 74 6b je 407d1d <_ZN12DynamicGraph12removeAedgesEjj+0xad>
407cb2: 8b 40 0c mov 0xc(%rax),%eax
407cb5: d1 e8 shr %eax
407cb7: 44 39 e8 cmp %r13d,%eax
407cba: 74 27 je 407ce3 <_ZN12DynamicGraph12removeAedgesEjj+0x73>
407cbc: 8b 43 10 mov 0x10(%rbx),%eax
407cbf: d1 e8 shr %eax
407cc1: 44 39 e8 cmp %r13d,%eax
407cc4: 74 1d je 407ce3 <_ZN12DynamicGraph12removeAedgesEjj+0x73>
407cc6: 48 83 c5 04 add $0x4,%rbp
407cca: 49 39 6c 24 08 cmp %rbp,0x8(%r12)
407ccf: 75 ce jne 407c9f <_ZN12DynamicGraph12removeAedgesEjj+0x2f>
407cd1: 48 83 c4 08 add $0x8,%rsp
407cd5: 44 89 f0 mov %r14d,%eax
407cd8: 5b pop %rbx
407cd9: 5d pop %rbp
407cda: 41 5c pop %r12
407cdc: 41 5d pop %r13
407cde: 41 5e pop %r14
407ce0: 41 5f pop %r15
407ce2: c3 retq
。。。下面还有很多,函数没完,这应该是某条路径的返回
unsigned DynamicGraph::removeAedges(unsigned node_id, unsigned anode_id)
{
Node *node = getNode(node_id);
unsigned num_deleted = 0;
vector<unsigned>::iterator i = node->aedge_ids.begin();
while (i != node->aedge_ids.end())
{
Edge *aedge = getEdge(*i);
if (aedge == NULL)
{
cout<<"error::DynamicGraph::removeAedges fail to get edge:"<<*i<<" of node:"<<node_id<<endl;
i++;
continue;
}
if (aedge->snode_id == anode_id || aedge->enode_id == anode_id)
{
i = node->aedge_ids.erase(i);
num_deleted++;
if (aedge->isBidirected() || num_deleted == 2) break;
}
else {
++i;
}
}
return num_deleted;
}
已经知道汇编是407c9f这一行崩溃的,有大神知道对应的C++代码哪行吗?
感谢各位同学的帮忙,应该就是访问迭代器崩溃的,原因是多线程访问(有删除操作)
这是一条镜像帖。来源:北邮人论坛 / cpp / #90753同步于 2016/3/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
C++崩溃汇编怎么看啊
iliketour
2016/3/25镜像同步42 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
崩溃估计是因为你%rbp中的地址非法不可读,看上一次用到%rbp,应该是在 0x407c90时,rax指向的值有问题。
这是Linux下的吧。。不太清楚Linux中是不是用rax来传递函数返回值,如果是的话。。问题就在407c8b的call的那个函数里面。。
AT&T语法不太懂,说错了请指正。。交流交流
【 在 iliketour (styx) 的大作中提到: 】
: 407c70: 41 57 push %r15
: 407c72: 49 89 ff mov %rdi,%r15
: 407c75: 41 56 push %r14
: ...................
因为/var/log/messages显示的那一行是407c9f,在此函数中。其实这个函数崩溃只可能是访问edge的成员变量snode_id或enode_id崩溃,因为edge的地址是一个非法地址,edge不是空,但是由于逻辑问题指向地址不对,所以崩溃,如果是取edge或取node函数里面崩溃,那么崩溃行号应该不在此函数范围内。这是我的分析。407c8b对应的call的是获取node的函数,所以应该就是我想的,但是我不知道这个getnode是获取哪一个?虽然知道了也可能没什么用。
【 在 jufds7788 的大作中提到: 】
: 崩溃估计是因为你%rbp中的地址非法不可读,看上一次用到%rbp,应该是在 0x407c90时,rax指向的值有问题。
: 这是Linux下的吧。。不太清楚Linux中是不是用rax来传递函数返回值,如果是的话。。问题就在407c8b的call的那个函数里面。。
: AT&T语法不太懂,说错了请指正。。交流交流
C/C++最大的问题就是一旦出错了,基本上都是“未定义行为”,就是从什么都不发生到机器冒烟都可能发生。换句话说,出错的时候没有报错信息。
所以,能做的就是不优化,并且用调试模式编译(gcc和clang的选项都是-O0 -g)。然后使用gdb运行。这样如果崩溃(一般是segmentation fault),gdb会告诉你在哪一行出错。
至于汇编,如果看不懂的话,不用太在意。C/C++都是很高级的语言,编译出来的汇编可能和源代码相差很多。极少有情况需要看汇编。
上removeAedge这个函数的代码看看?
因为没看全卤煮的代码,但是我怀疑
if (snode == NULL || enode == NULL)这句判断对吗,本意是想 if (snode == NULL && enode == NULL)?
我怎么觉得汇编和你给的代码对不上呢。。。。感觉汇编更像是removeAedge这个函数的。。。。
407c9d:DynamicGraph12removeAedgesEjj+0x61 看上去是一个短跳,407cd1 = 407c70 + 61,407c70是函数起始地址,根据符号来看应该是DynamicGraph::removeAedge