如何调试Apache AGE的make installcheck测试过程?
如何调试Apache AGE的make installcheck测试过程?
嘿,我完全懂你的痛点——直接gdb --args make installcheck肯定没用,因为make只是个负责调度的构建工具,真正跑测试逻辑的是PostgreSQL的pg_regress测试框架,以及背后运行的postgres进程(毕竟AGE是PostgreSQL的扩展,测试代码最终都是在postgres里执行的)。既然你已经会用GDB,那下面这两种方法应该能帮你精准调试测试过程:
方法一:单独调试指定测试案例(推荐,更高效)
这种方法适合你只想调试某一个特定测试文件的场景,步骤如下:
- 确保编译时带调试符号:不管是PostgreSQL还是Apache AGE,编译时一定要加
--enable-debug参数,不然GDB里看不到函数名、变量这些关键信息,调试等于瞎忙活。 - 手动启动带GDB的postgres实例:
- 先创建一个临时测试数据目录(比如
mkdir ~/age_test_db),然后初始化:initdb -D ~/age_test_db - 用GDB启动postgres:
gdb --args postgres -D ~/age_test_db - 在GDB里设置你需要的断点,比如要调试AGE的
cypher_execute函数,就输入break cypher_execute - 输入
run启动postgres进程,保持这个终端窗口打开
- 先创建一个临时测试数据目录(比如
- 运行指定测试文件:
- 新开一个终端,切换到Apache AGE的测试目录(比如
cd age/tests/regress) - 用
pg_regress指定连接到刚才启动的postgres实例,比如调试create_graph.sql测试:pg_regress --dbname=postgres --host=localhost --port=5432 create_graph.sql
- 新开一个终端,切换到Apache AGE的测试目录(比如
方法二:修改make installcheck的执行逻辑,全局调试
如果你想调试整个make installcheck的所有测试,可以修改测试框架的启动参数:
- 找到测试目录的Makefile:一般在
age/src/age/test/regress/Makefile路径下 - 修改pg_regress的调用参数:找到里面调用
pg_regress的行,加上--launcher='gdb --args'参数,这样pg_regress启动postgres时会自动用GDB包裹 - 执行make installcheck:运行
make installcheck后,会自动弹出GDB界面,你先设置好断点,输入continue,测试就会继续执行,遇到断点就会停下 - 可选:保留临时数据目录:默认
make installcheck跑完会删掉临时数据目录,如果你想事后排查问题,可以加上环境变量:
这样测试完成后数据目录不会被删除。REGRESS_TEMP_DIR=/path/to/your/temp/dir make installcheck
另外提醒一句:调试时如果遇到postgres进程退出或者测试卡住,记得检查GDB的输出,有时候是断点设置的位置不对,或者测试框架的临时端口冲突,调整一下就行。
备注:内容来源于stack exchange,提问作者Marco Souza
相关产品推荐
相关产品推荐

