打断点后想看的局部变量显示已被优化,只能看到部分参数。日志里能对上时间点,这种反而好排。

编译时开启了优化,变量被复用或消除,调试信息与实际执行不对应。这一点先确认清楚,后面就不用反复试。

# gcc
gcc -O0 -g -o app app.c
# Java
# -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

「调试变量不可见」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

处理上按这个顺序:调试构建关闭优化;使用调试符号;必须排查线上时改用日志。

结果对不对很好判断,断点处能看到完整变量值,单步执行与源码一致。

作者 9823189