我正在尝试在 Haskell 中分析我的项目,但在分析文件 (.prof) 中,我看到函数堆栈的打印顺序似乎有点混乱。
例如,在检查成本中心时(https://hackage.haskell.org/package/ghc-prof-1.4.1.12/docs/src/GHC.Prof.Types.html#CostCentre)堆栈在. prof 文件,下面是我看到的成本中心堆栈。
logError
log
findCustomerFromDB
getDBConfig
rSet
rSetB
preInitEncryptedOrder
decodeOrderDetails
mkOptionKey
encode
fromEncoding
genericToJSON
unTagged
value
encodeToBuilder
array
unId
emptyArray_
但是,我无法理解为什么在日志函数内部,探查器将数据库调用打印为它的子项。 (PS:在代码中,我没有在日志函数中调用数据库)
呼叫中心堆栈是精确构造的,随着成本中心的进入和退出,所以它的构造不受抽样的影响。并非所有在程序执行期间存在的呼叫中心堆栈都会被采样,但任何被采样的呼叫中心堆栈都将是一个实际的调用堆栈,而不是采样错误的产物。
此外,呼叫中心堆栈在创建时存储在 thunk 中,并在评估 thunk 时恢复,因此延迟评估不会产生奇怪的混合堆栈,表示在实际强制延迟值时恰好有效的函数调用在某个不可预测的时间。
因此,如果这些成本中心已正确命名(即,没有漂浮着错误名称的杂散
SCC
编译指示)并且假设您没有查看一个名为 log
的函数的代码并将其与分析进行比较一个完全不同的 log
函数的信息,除了明显的调用堆栈之外没有逻辑解释: findCustomerFromDB
事实上,由 log
函数直接调用,或通过其他一些内联函数调用.
我建议仔细检查您的
log
函数并检查它是否调用辅助函数,该辅助函数将一些调试信息添加到记录的字符串中,例如发起违规请求的客户的名称。