2014-04-10 25 views
2

在我們的系統測試中運行我們的Erlang應用程序時,我有時想打開並捕獲調試跟蹤。打開遠程節點上的dbg跟蹤?

Erlang的節點使用RELX啓動腳本(稱爲_rel/bin/foo foreground)開始,所以我沒有在啓動選項進行任何控制。系統測試運行器(用Python編寫)從節點捕獲stdout。

如何連接到Erlang節點,使用-remsh,打開dbg -tracing,並將輸出寫入到原始節點上的stdout?我如何以一種Python友好的方式來做到這一點(儘管如果這樣做會更容易,我很樂意寫一個腳本)。

爲了進一步複雜化這一點,產生RELX版本不包括runtime_tools庫,所以dbg:沒有實際可用的,所以我也將添加this question

回答

0

有很少的方法可以做到這一點。一切取決於你所熟悉的,以及你的用例。

  • 我就從手工盡一切開始。這樣,你就可以最大程度地控制這個問題,並且可以看出效果如何(如果調試太多或者調試不足)。這是我最熟悉的,並在最後你幾乎總是會連接到遠程shell,並用手做一些事情(從我的經驗)的dbg

  • 一個功能,不會有太多人談論我的能力從文件中保存/加載跟蹤pasterns。我發現了在會話之間存儲和共享調試信息的最簡單方法;但缺乏可讀性可能是太大的折衷。

  • 如果您不想過多幹擾您的實時系統,則不必使用dbg。你可以使用erlang:trace在缺省情況下給出的,但你必須謹慎對待的狀態,你離開你的虛擬機中(dbg應關閉所有跟蹤後退出;與erlang:trace這是你的責任)

  • 如果調試會話的一部分python腳本,編寫腳本並從python調用它將是我的出路。你只需要記住escript是在新的虛擬機中運行的,並且-remsh而不是允許你在其他虛擬機上運行你的代碼。你將不得不使用rpc模塊。

  • 由於您使用的應用程序已發佈,您可能會查看日誌記錄。有人可能會認爲應該已經有一些日誌記錄,很有可能lager這在Erlang中有些標準,並且有可能到change logging level during runtime

我個人會嘗試一些混合的第一個和最後一個選項,只是試驗。

+0

我們已經在使用啤酒進行世俗記錄;對於這個特別失敗的測試,我希望得到我模塊中每個被調用函數的跟蹤。這不是在生產中,所以我不打擾性能影響。 –