Haskell中无法输出调用栈以定位矩阵不匹配错误
解决hmatrix中liftMatrix2Auto矩阵不兼容错误的定位问题
以下是几种直接可行的定位方法:
编译时添加完整调试与 profiling 信息
编译命令加上-g(生成调试符号)、-fprof-auto(自动为所有函数生成成本中心),保留-rtsopts支持运行时参数:ghc -g -fprof-auto -rtsopts YourMainModule.hs运行程序时启用
-xc触发调用栈追踪:./YourMainModule +RTS -xc无优化下的编译(
-O0)能进一步提升行号准确性,避免GHC优化导致的行号偏移:ghc -O0 -g -fprof-auto -rtsopts YourMainModule.hs手动在可疑函数内追踪调用栈
已知错误关联到newDuty函数,给该函数内的关键矩阵操作拆分到子函数,并为子函数添加HasCallStack约束,把调用栈信息传递到底层:newDuty :: HasCallStack => YourReturnType newDuty = do let mat1 = buildMat1 mat2 = buildMat2 -- 把矩阵操作拆到带CallStack的子函数 combined = combineMats mat1 mat2 combined where combineMats :: HasCallStack => Matrix Double -> Matrix Double -> Matrix Double combineMats a b = a + b -- 这里会触发hmatrix的liftMatrix2Auto这样错误发生时,调用栈会包含
combineMats的具体行号。追踪矩阵形状快速定位问题
利用Debug.Trace在矩阵操作前打印维度,直接找到不匹配的矩阵对(错误提示是(0x4)和(4x1),重点找0行的矩阵):import Debug.Trace (trace) import Numeric.LinearAlgebra (rows, cols, Matrix) traceMatShape :: Matrix Double -> Matrix Double traceMatShape m = trace ("Matrix shape: " ++ show (rows m, cols m)) m newDuty = do let matA = traceMatShape $ buildMatA matB = traceMatShape $ buildMatB result = matA * matB -- 假设是乘法触发错误 result运行后会输出所有经过的矩阵形状,错误前的最后一组形状就是问题所在。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

