gdb调试提问:程序运行不下去,顺便问下单元测试,logging失败

请问为很么我的程序走不下去?


nebula版本是2.0.1。
是否可以详细说一下单元测试?

没有看到模块名?

你是用 gdb 去启动 nebula-graph的,你启动的时候需要设置args,需要传入
`set args --flagfile ${graph_config_file}', 不然程序就退出了。

单元测试的binary生成在 nebula-graph/build/bin/test 目录下,你可以看到

假如你想通过 gdb 运行executor_test

在build目录下直接运行

gdb bin/test/executor_test

感谢,我已经设置过了,如下,但还是一样的结果:

我是看了这篇博客做的设置:

感谢,我已经设置过了,如下,但还是一样的结果

什么结果,我看截图没有任何异常

你 debug的是 2.0 的代码,文章用的是 1.0 的代码,代码都不是一套,2.0 和 1.0 的 graphd架构已经发生很大的变化了。所以你看到的代码不一样是正常的。

1 个赞


如图,我设置了参数后,程序还是到这里就终止了。

1、 你可以在line 56行时 打印一下 FLAGS_flagfile的值, 是不是没有设置对

你设置了肯定就不会报这个错的,你要不把gdb 启动的整个过程截图,不要截一部分

如下:


你直接执行 gdb nebula-graph
进去后执行 set args --flagfile /usr/local/nebula/etc/nebula-graph.conf
然后执行 run
然后把这个过程截图下

r 后面就不要加 start program:nebula-graph, 加了就相当于你设置的参数无效了,你又指定一个binary启动了

3 个赞

感谢解答,但是为什么在logging就失败?

你通过gdb 启动的话,在你启动目录的 logs 目录是需要你自己创建,所以你需要在当前目录创建个 logs目录 和 pids 目录

1 个赞

感谢!!! :pray: :pray: :pray:
请问为什么程序直接就结束?看源码不是应该等待console来连接吗?

以及我该如何用console端连接我调试的进程?我的目的是想追踪代码,比如添加一个顶点这样的命令是如何走下去的,执行了那些操作,借此来验证我对代码理解的对不对。

有可能是端口被占用了,你可以看下你当前目录 logs下面的nebula-graph.INFO 日志,里面会打印退出的日志。

还有建议你按照编译文档,将编译好的文件安装到安装目录后,用 scripts 下面的脚本启动三个服务 scripts/nebula.service start all,然后通过 gdb attach graphd_pid 这样去 debug 比较好,不然没有metad和storaged,你没法走通整个流程。

好的!我尝试了这种方式调试。
但是我启动后,显示graph的是退出的,没有pid?

但有意思的是,我用console还能连得上nebula。 :joy:

上面没有显示退出的,你可以通过 /usr/local/nebula/scripts/nebula.service status all 看状态的


不好意思啊,我少截了一张图,状态如上图所示。

建议按照这个流程操作:

  1. 关闭正在运行的服务 /nebula/scripts/nebula.service stop all
  2. 检查是否还有进程 ps -ef | grep nebula
  3. 启动服务 /nebula.service start all
  4. 检测进程状态 /nebula/scripts/nebula.service status all
  5. gdb attach graphd_pid
  6. console链接上服务后发送query
1 个赞

你应该是之前gdb启动的graphd还在,所以你的console 连接的就是你之前gdb启动的graphd服务,
你将 ps -ef | grep nebula-graphd 的进程 kill 掉,然后再通过脚本 /usr/local/nebula/scripts/nebula.service start graphd

1 个赞