由于某种原因,我有一个无限期失败的事务,我想在里面使用跟踪指令。例如,要在执行此片段中的事务之前打印MVar的状态:
data_out <- atomically $ do
rtg_state <- takeTMVar ready_to_go
JobDescr hashid url <- T.readTBChan next_job_descr
case rtg_state of
Ready_RTG n -> do
putTMVar ready_to_go $ Processing_RTG n
putTMVar start_harvester_browser hashid
putTMVar next_test_url_to_check_chan hashid
putTMVar next_harvest_url hashid
return (n,hashid,url)
_ -> retry
这是否会使程序出现段错误或错过行为?
答案 0 :(得分:9)
只要您使用trace
进行调试,就应该没问题。作为一般规则,假设在程序的最终生产就绪版本中没有trace
。
您永远不会从trace
观察到段错误。它的“不安全”源于它在纯代码中注入可观察的效果。例如,在STM中,当事务重试时,假定其效果被回滚。如果trace
用于向用户发送消息,则无法回滚。如果trace
的输出触发导弹发射,你将不得不处理国际副作用。如果trace
只是通过“FYI,代码正在执行X”向开发人员发出信号,那么这不是程序核心逻辑的一部分,并且非常好。