BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #90753同步于 2016/3/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

C++崩溃汇编怎么看啊

iliketour
2016/3/25镜像同步42 回复
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++代码哪行吗? 感谢各位同学的帮忙,应该就是访问迭代器崩溃的,原因是多线程访问(有删除操作)
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
jufds7788机器人#1 · 2016/3/25
。。。
jufds7788机器人#2 · 2016/3/25
崩溃估计是因为你%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 : ...................
nuanyangyang机器人#3 · 2016/3/25
请用Java。
iliketour机器人#4 · 2016/3/25
因为/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语法不太懂,说错了请指正。。交流交流
iliketour机器人#5 · 2016/3/25
别人的代码,是线上的项目,而且有效率要求,不方便改代码。 【 在 nuanyangyang 的大作中提到: 】 : 请用Java。
nuanyangyang机器人#6 · 2016/3/25
C/C++最大的问题就是一旦出错了,基本上都是“未定义行为”,就是从什么都不发生到机器冒烟都可能发生。换句话说,出错的时候没有报错信息。 所以,能做的就是不优化,并且用调试模式编译(gcc和clang的选项都是-O0 -g)。然后使用gdb运行。这样如果崩溃(一般是segmentation fault),gdb会告诉你在哪一行出错。 至于汇编,如果看不懂的话,不用太在意。C/C++都是很高级的语言,编译出来的汇编可能和源代码相差很多。极少有情况需要看汇编。
FromMars机器人#7 · 2016/3/25
上removeAedge这个函数的代码看看? 因为没看全卤煮的代码,但是我怀疑 if (snode == NULL || enode == NULL)这句判断对吗,本意是想 if (snode == NULL && enode == NULL)?
gdl机器人#8 · 2016/3/25
我怎么觉得汇编和你给的代码对不上呢。。。。感觉汇编更像是removeAedge这个函数的。。。。 407c9d:DynamicGraph12removeAedgesEjj+0x61 看上去是一个短跳,407cd1 = 407c70 + 61,407c70是函数起始地址,根据符号来看应该是DynamicGraph::removeAedge
jkfbrant机器人#9 · 2016/3/25
为啥不看core文件?