簡體   English   中英

您如何自動啟動/調試大型項目?

[英]How do you automate the launching/debugging of large scale projects?

場景:

有一個復雜的軟件很難手動啟動。 我所做的是創建一個python腳本來啟動可執行文件並附加gdb進行調試。

流程啟動腳本:

  • 確保設置環境變量。
  • 確保將本地構建目錄添加到環境的LD_LIBRARY_PATH變量中。
  • 將當前工作目錄更改為可執行文件期望的位置(不是我的設計)
  • 使用配置文件啟動可執行文件唯一的命令行選項
  • 將可執行文件的輸出傳遞給第二個日志記錄進程
  • 記住可執行文件的PID,然后啟動並將gdb附加到正在運行的可執行文件。

該腳本有效,但有一點需要注意。 ctrl-c不會中斷debugee並將控制權返回給gdb。 因此,如果我“繼續”沒有活動斷點,我永遠不能再次停止該過程,它必須從另一個shell中被殺死/中斷。 順便說一句,運行“kill -s SIGINT <pid>”,其中<pid>是調試對象的pid確實讓我回到了gdb的提示......但是這樣做是非常煩人的

起初我以為Python正在抓取SIGINT信號,但事實並非如此,因為我設置信號處理程序將信號轉發給debugee並且不能解決問題。

我已經嘗試了各種配置到python腳本(調用os.spawn *而不是子進程等)似乎無論如何,如果python啟動子進程,SIGINT(ctrl-c)信號不要被路由到gdb或子進程。

目前的思路

  • 這可能與debugee&gdb需要一個單獨的進程組ID有關...對此有任何信任嗎?
  • SELinux可能存在錯誤?

信息:

  • gdb 6.8
  • Python 2.5.2(Python 2.6.1中也存在問題)
  • SELinux環境(向進程發送信號的錯誤?)

我考慮的替代方案:

  • 設置.gdbinit文件以執行腳本執行的操作,環境變量和當前工作目錄是此方法的問題。
  • 啟動可執行文件並手動附加gdb(yuck)

問題:如何自動啟動/調試大型項目?

更新:我已經嘗試了下面的Nicholas Riley的例子,在家里的Macintosh上他們都允許cntl-c工作到不同程度,在生產盒子上(我現在認為可能正在運行SELinux)他們不...

您可以嘗試忽略它,而不是將信號從Python轉發到調試對象。 以下對我有用:

import signal
signal.signal(signal.SIGINT, signal.SIG_IGN)

import subprocess
cat = subprocess.Popen(['cat'])
subprocess.call(['gdb', '--pid=%d' % cat.pid])

有了這個,我能夠在GDB中重復進行^ C並且沒有問題地中斷調試對象,但是我確實看到了一些奇怪的行為。

順便說一下,在將信號轉發到目標進程時我也沒有問題。

import subprocess
cat = subprocess.Popen(['cat'])

import signal, os
signal.signal(signal.SIGINT,
              lambda signum, frame: os.kill(cat.pid, signum))

subprocess.call(['gdb', '--pid=%d' % cat.pid])

那么,你的情況可能會發生其他事情嗎? 如果你發布一些破解的代碼,它可能會有所幫助。

你的評論指出你正在用膩子砸...你有控制權嗎? 使用openssh,您可能希望添加-T選項,我不知道/如果putty將以您使用它的方式執行此操作。

另外:你可能會嘗試使用cygwin的ssh而不是putty。

如果您已經設置了當前腳本來執行此操作,但是在自動執行部分腳本時遇到問題,可能您只需抓住期望並使用它來提供設置,然后退回到交互模式以期啟動該過程。 然后你仍然可以讓你的ctrl-c中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM