已解决 请问如何源码调试canal
-
现在线上canal出了一些问题,我想做源码调试,断点调试或者加沙(System.out.println)调试都可以。
有没有哪位可以做个教程,如何命令行修改并调试java项目源代码
-
@楚天乐 先下载和你使用的版本像对应的源码版本,这样堆栈中的行号才会和你源码中的行号互相匹配。
阅读堆栈,定位DEBUG的类和方法
如果看到异常堆栈,可以确定异常的方法和类。例如如下堆栈,可以看到出问题的方法主要是LogBuffer,RowsLogBuffer和LogEventConvert这几个类。选择哪个类和方法debug来诊断问题是有技巧的,主要选择哪些本地变量有一些语义的地方打印日志是比较好的。针对下面这个堆栈,我们查看相关类和方法的源码之后,可以直接在fetchValue这个方法上打断点,因为这边入参有columnName等信息,可以方便我们确定是哪个列的内容解析时产生了这个问题。可以直接加个try-catch,这样方便有异常的时候才进入断点,或者使用IDEA的条件断点也是可以的。
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed. Caused by: java.lang.IllegalArgumentException: limit excceed: 258 at com.taobao.tddl.dbsync.binlog.LogBuffer.getInt8(LogBuffer.java:253) at com.taobao.tddl.dbsync.binlog.event.RowsLogBuffer.fetchValue(RowsLogBuffer.java:286) at com.taobao.tddl.dbsync.binlog.event.RowsLogBuffer.nextValue(RowsLogBuffer.java:95) at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parseOneRow(LogEventConvert.java:409) at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parseRowsEvent(LogEventConvert.java:331) at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parse(LogEventConvert.java:101) at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parse(LogEventConvert.java:61) at com.alibaba.otter.canal.parse.inbound.AbstractEventParser.parseAndProfilingIfNecessary(AbstractEventParser.java:322) at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3$1.sink(AbstractEventParser.java:175) at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.dump(MysqlConnection.java:124) at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3.run(AbstractEventParser.java:208) at java.lang.Thread.run(Thread.java:748)
配置和启动程序
源码中相关的几个properties文件也需要配置好canal.properties和instance.properties等。Server可以通过CanalLauncher的main方法启动,然后等待进入断点
Copyright © 2020 ClouGence, Inc.备案号:浙ICP备20007605号-2