我正在使用linux内核提供的cmpxchg()(SLES11-SP2) 它很恐慌。 崩溃的确切点在2005年:
if (cmpxchg(var, old, new) == old)
2002: 48 89 d8 mov %rbx,%rax
2005: f0 4d 0f b1 34 24 lock cmpxchg %r14,(%r12)
200b: 48 39 c3 cmp %rax,%rbx
200e: 74 27 je 2037 <atomicPatchFnPtr+0x77>
任何关于我如何进行调试的线索?是否由于锁定变量的竞争条件而发生? 或者我是否需要将此作为内核上的错误发布?
答案 0 :(得分:2)
如果传递的地址(在此处为%r12)无效,则锁定cmpxchg指令可能会导致访问冲突。这可能是上面代码行中的变量var。它表明var指向一些无效的内存。它不是cmpxchg函数中的竞赛,但它可能仍然是调用函数中的竞争条件。