2017-06-09 74 views
0

我有一個來自長時間運行的進程的核心文件。這將有助於我獲得該流程的開始時間。從核心文件獲取程序開始時間

在linux下有沒有辦法,使用gdb從核心文件中獲取進程啓動時間?

感謝

+0

長期運行的程序是什麼?你有它的源代碼嗎? –

+0

是的,我有它的源代碼。我將添加時間戳以開始未來。然而它不會幫助我使用當前的核心文件。 – Jan

回答

0

有linux下的方式,用gdb只得到從核心文件的過程開始時間?

我不這麼認爲。但是,請參閱core(5) & proc(5)並在您的core文件上運行file(1)命令。

將來,您可能會使用/proc/sys/kernel/core_pattern(在系統啓動時)。 %t給出了轉儲時間(不是開始時間)。

我想你有核心轉儲可執行文件的源代碼(否則,檢查覈心在實踐中不是很有用)。

我建議改善您的長期運行程序的來源,將time(2)的結果放入一個全局或靜態變量,在main開始附近。 您可能還想在您的源代碼中添加時間戳。


這裏有個竅門讓(您的源代碼)時間戳,假設你用make構建和使用git版本控制:

要麼只使用在一些使用__DATE____TIME__ C或C++文件,或者更可能的是附加的生成的包含日期和文件的C文件目前git commit登錄。如果您使用make隨時都在添加一些規則像

_timestamp.c: Makefile 
     @date +'const char my_timestamp[]="%c";' > _timestamp.tmp 
     @(echo -n 'const char my_lastgitcommit[]="' ; \ 
      git log --format=oneline --abbrev=12 --abbrev-commit -q \ 
      | head -1 | tr -d '\n\r\f\"\\\\' ; \ 
      echo '";') >> _timestamp.tmp 
     @(echo -n 'const char my_lastgittag[]="'; \ 
      (git describe --abbrev=0 --all || echo '*notag*') | \ 
      tr -d '\n\r\f\"\\\\'; echo '";') >> _timestamp.tmp 
     @mv _timestamp.tmp _timestamp.c 

Makefile(並在規則建立你的可執行文件,而且還_timestamp.o鏈接,並在其配方中添加$(RM) _timestamp.c)。


我建議,對於長時間運行的程序,如服務器(或批量數字代碼運行天),用在他們裏面syslog(3)設施。一些初始syslog可能會顯示my_timestamp,my_lastgitcommit,my_lastgittag,如上面的_timestamp.c中所生成的。

+0

謝謝,我正在搜索互聯網,也發現它不能只從核心文件完成。我會保持這個開放一段時間,看看別人是否知道如何做到這一點,如果沒有答案是增加,那麼我會接受你的答案 – Jan