- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 Opencog 开源框架的 Python 绑定(bind),试图修复一些崩溃,但我遇到了崩溃:
PyObject * pyAtomSpace;
if (atomspace)
pyAtomSpace = py_atomspace(atomspace);
来自:
https://github.com/opencog/opencog/blob/master/opencog/cython/PythonEval.cc#L148
它在调用 cython 例程的最后一行崩溃,该例程使用带有以下 cython 代码的 python 对象包装 C++ 对象:
cdef api object py_atomspace(cAtomSpace *c_atomspace) with gil:
cdef AtomSpace atomspace = AtomSpace_factory(c_atomspace)
return atomspace
来自: https://github.com/opencog/opencog/blob/master/opencog/cython/opencog/atomspace_details.pyx#L407-410
崩溃是 SIGSEGV:
(gdb) bt
#0 0x0000000000000000 in ?? ()
#1 0x00007ffff6354b6f in opencog::PythonEval::getPyAtomspace (
this=<optimized out>, atomspace=<optimized out>)
at /home/opencog/src/opencog/opencog/cython/PythonEval.cc:160
#2 0x00007ffff6354dd7 in opencog::PythonEval::init (this=0x67eb60)
at /home/opencog/src/opencog/opencog/cython/PythonEval.cc:103
#3 0x00007ffff635512e in opencog::PythonEval::instance (atomspace=0x62c300)
at /home/opencog/src/opencog/opencog/cython/PythonEval.cc:226
#4 0x00007ffff7bb5a83 in opencog::CogServer::CogServer (this=0x62bd40)
at /home/opencog/src/opencog/opencog/server/CogServer.cc:127
#5 0x00000000004141bb in TestCogServer::createInstance ()
at /home/opencog/src/opencog/tests/cython/PythonModuleUTest.cxxtest:37
#6 0x00007ffff7bb2a4a in opencog::server (
factoryFunction=0x4141a0 <TestCogServer::createInstance()>)
at /home/opencog/src/opencog/opencog/server/BaseServer.cc:65
#7 0x0000000000416e51 in PythonModuleUTest::PythonModuleUTest (
this=0x6216f0 <suite_PythonModuleUTest>)
at /home/opencog/src/opencog/tests/cython/PythonModuleUTest.cxxtest:82
如何调试此崩溃?我尝试单步执行汇编程序。首先,我在打开 disassemble-next-line 时崩溃的行上设置了一个断点。注意:我用 routine
替换了下面的 opencog::PythonEval::getPyAtomspace(opencog::AtomSpace*)
:
Breakpoint 1, opencog::PythonEval::getPyAtomspace (this=0x67eb50,
atomspace=0x62c2f0)
at /home/opencog/src/opencog/opencog/cython/PythonEval.cc:160
160 pyAtomSpace = py_atomspace(atomspace);
=> 0x00007ffff6354b66 <routine+6>: 48 89 f7 mov %rsi,%rdi
0x00007ffff6354b69 <routine+9>: ff 15 29 69 20 00 callq *0x206929(%rip) # 0x7ffff655b498 <_ZL40__pyx_f_7opencog_9atomspace_py_atomspace>
0x00007ffff6354b6f <routine+15>: 48 89 c3 mov %rax,%rbx
callq之前的寄存器:
(gdb) info registers
rax 0x1c 28
rbx 0x67eb50 6810448
rcx 0x7ffff7716320 140737344791328
rdx 0x68 104
rsi 0x62c2f0 6472432
rdi 0x67eb50 6810448
rbp 0x7fffffffe790 0x7fffffffe790
rsp 0x7fffffffe780 0x7fffffffe780
r8 0x0 0
r9 0x9b57b0 10180528
r10 0x7fffffffe550 140737488348496
r11 0x7ffff6354b60 140737324075872
r12 0x7ffff7b8b140 140737349464384
r13 0x0 0
r14 0x62c2f0 6472432
r15 0x62bf01 6471425
rip 0x7ffff6354b66 0x7ffff6354b66 <opencog::PythonEval::getPyAtomspace(opencog::AtomSpace*)+6>
eflags 0x206 [ PF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
看起来 callq 是使用 %rip
寄存器进行的寄存器相对调用,其值为 0x7ffff6354b66
和偏移量 0x206929
。
(gdb) disas /r 0x7ffff6354b66+0x206929,+10
Dump of assembler code from 0x7ffff655b48f to 0x7ffff655b499:
0x00007ffff655b48f <_ZN7opencog10PythonEval17singletonInstanceE+7>: 00 01 add %al,(%rcx)
0x00007ffff655b491 <_ZZN7opencog10PythonEval4initEvE19eval_already_inited+0>: 01 00 add %eax,(%rax)
0x00007ffff655b493: 00 00 add %al,(%rax)
0x00007ffff655b495: 00 00 add %al,(%rax)
0x00007ffff655b497: 00 00 add %al,(%rax)
End of assembler dump.
和原始内存转储:
(gdb) x/10 0x7ffff6354b66+0x206929
0x7ffff655b48f <_ZN7opencog10PythonEval17singletonInstanceE+7>: 0x00010100 0x00000000 0x00000000 0x00000000
0x7ffff655b49f <_ZL40__pyx_f_7opencog_9atomspace_py_atomspace+7>: 0x6213f000 0x00000000 0x6213f800 0x00000000
0x7ffff655b4af <_ZN5boost4asio5errorL17addrinfo_categoryE+7>: 0x62140000 0x00000000
然后使用si
单步执行:
(gdb) si
0x00007ffff6354b69 160 pyAtomSpace = py_atomspace(atomspace);
0x00007ffff6354b66 <routine+6>: 48 89 f7 mov %rsi,%rdi
=> 0x00007ffff6354b69 <routine+9>: ff 15 29 69 20 00 callq *0x206929(%rip) # 0x7ffff655b498 <_ZL40__pyx_f_7opencog_9atomspace_py_atomspace>
0x00007ffff6354b6f <routine+15>: 48 89 c3 mov %rax,%rbx
(gdb) si
[2015-02-24 01:43:14:072] [INFO] PythonEval atomspace 1
0x0000000000000000 in ?? ()
=> 0x0000000000000000: Cannot access memory at address 0x0
鉴于上述所有情况,我不确定零取消引用从何而来,但我一直不熟悉 Linux 上的 X86 汇编器。
它的行为就像加载包含它的动态库时 cython 代码没有正确链接一样。或者其他的东西?知道为什么调用 py_atomspace cython 例程会导致此崩溃吗?我在上面遗漏了一些明显的东西吗?还是出了什么问题?
我还应该提到,上面的代码在很多情况下都工作得很好,只是在我改变了Python初始化的一些方式之后,我才遇到了上面的崩溃。因此,我试图弄清楚我的更改如何影响此调用,因为我没有对 cython 代码 py_atomspace 或 py_atomspace 的调用者进行任何更改。
最佳答案
事实证明,即使您需要在一个地方初始化 Python,Cython 也必须在很多地方初始化。
您需要调用 Cython 生成的导入函数,在 OpenCog 的情况下:
import_opencog__atomspace();
和
import_opencog__agent_finder();
在每个共享库中调用 Cython 代码中声明为“api”的函数。否则,您会在第一次调用该共享库中的该函数时发生崩溃。正如您在上面看到的,SIGSEGV 不会留下有用的堆栈跟踪。它只是两条汇编指令和寄存器相关的 callq 段错误。你知道它在 api 调用中崩溃了,是的,但是当你验证你确实在调用导入函数时,天哪,你刚刚单步执行了它,它仍然崩溃了。调用它是不够的,您需要在该共享库中调用它。
Cython 文档根本没有提到这一点(至少在我提交拉取请求来解决这个问题之前)。
关于c++ - 调试从 C++ 调用的 Cython 代码中的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28687248/
昨晚我因为这个问题脑子崩溃了。在确保没有来 self 的 eclipse 错误检查的明显错误之后,我开始调试我的程序。顺便说一下,我正在使用 Jre7。无论如何,每次我进入我的类调用(我们称之为“a”
(前言:我对 C/C++ 还很陌生,我真的不知道 native 代码中的调试实际上是如何工作的。) 一些消息来源说 gdb 和 lldb 可以调试 any program compiled to ma
我正在尝试从 Visual Studio 2012 外部调试 T4Scaffolding.Core Nuget 包。我使用的是安装了 Powershell 3.0 的 Powershell ISE,并
如何调试汇编代码?我在 Linux 上使用 gdb。我知道我可以看寄存器。有哪些调试汇编代码的方法? 最佳答案 您当然可以使用 breakpoints就像 C 或任何其他编译语言一样。 This ar
如何在每次通话时打印列表或 haskell 中的内容,例如: funct a list = funct (a + 1) (a : list) print list her
让我用我对 Makefiles 或 make 知之甚少的评论作为这个问题的前缀。 有一个非常大的项目,每晚自动构建。它以 Debug 和 Release 模式构建,Debug 用于 Valgrind
我正在创建一个计算每周工资的程序,那么任何加类工资都是该周正常工资的 1.5 倍。我的代码如下: #include int main() { double payrate; double h
我使用的是 Visual Studio 2010 Express Developer 版本。开发网站。我在我的 .aspx 页面中使用 JavaScript。 如何在 Javascript 中放置断点
我最近开始修补 Project Euler 问题,并尝试用 Javascript 解决它们。这样做我往往会产生许多无限循环,现在我想知道是否有比终止 Firefox 或 Chrome 中的选项卡更好的
有没有办法在程序执行期间生成一个交互式 python 控制台(最好是 iPython)而不暂停主程序并且能够检查和修改程序变量?类似于浏览器为 JavaScript 提供的功能。 我知道 pdb.se
我正在使用 FFmpeg @ Android 并希望能够进入 FFmpeg 代码(Eclipse + Seqouya),同时编译 FFmpeg 我使用 --disable-stripping --en
我从使用互操作调用 win32 api 函数的 .net 进程中得到一个异常。 我有一个调试器,我想查看 LastError 的值。 是否可以从 Visual Studio 调试器中查看 LastEr
我正在尝试通过 VBA 创建一个宏,以在 IE 的多个选项卡中打开一组指定的链接。目前我正在使用下面的代码,如果我试图打开 3 个或更少的选项卡,它大部分时间都可以工作。任何超过 3 的代码都会在“N
好的,这似乎是一个愚蠢的问题,因为 MonoDevelop 越来越成熟,所以我确定我只是想念它,但我环顾四周,所有关于这个主题的问题似乎都是关于远程调试或 Mac 上的调试。 我使用的是 Ubuntu
如何调试 Rscripts是从命令行运行的? 我目前正在使用 getopt传递命令行选项的包,当有错误时,我很难: 看看到底出了什么问题; 在 R 中交互式调试(因为脚本需要命令行选项。) 有没有人有
支持 PDF 和网络上的信息很少。我碰巧在博客中看到一篇文章,提到 $.write() 或 $.writeln() 将向 javascript 控制台写入一个字符串。相当有用。有谁知道这个 $ 对象是
PyCharm 1.5 中是否可以使用 Firefox 和 Chrome 支持的 JavaScript 调试? 如果是这样,它能否与 Python/Django 调试器一起有效运行? 如果没有,有没有
我确定这以前发生在人们身上,某些东西在 Debug模式下工作,你在发布时编译,但有些东西坏了。 这发生在我在嵌入式 XP 环境中工作时,我发现最好的方法确实是编写一个日志文件来确定它会出错的地方。 您
我目前正在为即将到来的项目评估 Flow3。 AOP 模式和依赖注入(inject)将非常适合我们的目的。 现在我想不通的是如何在 Controller Action 中调试一些结果。 public
最初,我有一个包含测试服务器的 Django 应用程序。要调试此设置,我只需添加 import pdb; pdb.set_trace()代码中的任何位置,并且有一个断点将我扔到终端中的交互式调试器中(
我是一名优秀的程序员,十分优秀!