在gdb中,您可以通过Cc中断(暂停)程序并继续.
你能在pdb中这样做吗?
有没有办法在Linux上检查正在运行的Python守护进程正在做什么?也就是说,没有检测代码而没有终止它?我希望得到模块的名称和当前正在运行的行号.
常规调试工具(如strace,pstack和gdb)对Python代码不是很有用.大多数堆栈帧只包含来自解释器代码的函数,如PyEval_EvalFrameEx和PyEval_EvalCodeEx,它不会在执行的.py文件中提供任何提示.
是否有可能在不中断的情况下找到有关正在运行的Python程序正在执行的操作的任何信息?
另外,如果不可能的话,无论如何都要崩溃一个正在运行的Python程序,这样我至少可以获得一个堆栈跟踪(在Ubuntu上使用PyDev)?
我知道我应该使用日志或在调试模式下运行它或插入一个语句来运行调试器...
相关问题
我有一个遵循标准范例的简单线程Python程序:
class SearchThread(threading.Thread):
def __init__(self, search_queue):
threading.Thread.__init__(self)
self.search_queue = search_queue
def run(self):
while True:
try:
search_url = self.search_queue.get(timeout=15)
# <do Internet search and print output/>
except Queue.Empty:
self.search_queue.task_done()
break
except Exception, e:
print e
if __name__ == '__main__':
search_queue = Queue.Queue()
for i in range(200):
t = SearchThread(search_queue)
t.setDaemon(True)
t.start()
search_queue.join()
Run Code Online (Sandbox Code Playgroud)
队列中填充了大约1000个URL并且HTTP GET执行简单<do Internet search and print output/>.问题是,在处理了大约500-700个条目(只需几秒钟)之后,程序会一直挂起,没有输出,没有例外,没有任何内容.
我试过requests,urllib2,urllib3,httplib2的HTTP GET但没有改变.
你如何调试挂起的线程Python程序?
顺便说一句,我在Ubuntu 11.10(64位)下使用Python 2.7.
当我盯着挂起过程中的gdb跟踪时,我和以前一样无能为力 …
我正在处理一个python编写的服务器,它会锁定并停止工作,包括记录.我想知道是否有一个python相当于java的"kill -3"信号,至少打印出当前的堆栈跟踪.
我必须运行一个传统的Zope2网站,并对此有一些不满.最大的问题是,它偶尔会锁定,以100%的CPU负载运行而不再响应请求.虽然这个问题不能定期重现,但是有时会有一个包含3个动态图形的页面触发它,所以我怀疑某种竞争条件会导致无限循环或陷入忙碌状态.
问题是,我还没有找到调试这个东西的方法.Zope日志中没有任何内容,系统日志中没有任何内容.我尝试了这个问题的建议来获得一个堆栈跟踪,但唯一有效的信号是SIGKILL.
是否还有另一种可能性来确定卡住的过程究竟在哪里?
我刚刚注意到multiprocessingLinux上进程终止(来自库)方法的问题.我有应用程序使用multiprocessing库,但...当我terminate在Windows上调用函数一切都很好,另一方面Linux失败了这个解决方案.作为过程杀戮的替代,我被迫使用
os.system('kill -9 {}'.format(pid))
Run Code Online (Sandbox Code Playgroud)
我知道这不是太聪明,但它确实有效.所以我只是想知道为什么这段代码在Windows上运行,但在Linux上运行失败.
例:
from multiprocessing import Process
import os
process=Process(target=foo,args=('bar',))
pid=process.pid
process.terminate() # works on Windows only
...
os.sytem('kill -9 {}'.format(pid)) # my replacements on Linux
Run Code Online (Sandbox Code Playgroud)
我的配置:python 3.2.0 build 88445; Linux的2.6.32-Debian的6.0.4
这是我的代码中的示例.我希望这就足够了.
def start_test(timestamp,current_test_suite,user_ip):
global_test_table[timestamp] = current_test_suite
setattr(global_test_table[timestamp], "user_ip", user_ip)
test_cases = global_test_table[timestamp].test_cases_table
test_cases = test_cases*int(global_test_table[timestamp].count + 1)
global_test_table[timestamp].test_cases_table = test_cases
print(test_cases)
print(global_test_table[timestamp].test_cases_table)
case_num = len(test_cases)
Report.basecounter = Report.casecounter = case_num
setattr(global_test_table[timestamp], "case_num", case_num)
setattr(global_test_table[timestamp], "user_current_test", 0)
try:
dbobj=MySQLdb.connect(*dbconnector)
dbcursor=dbobj.cursor()
dbcursor.execute(sqlquery_insert_progress.format(progress_timestamp …Run Code Online (Sandbox Code Playgroud) 有没有相当于jstack的python?我有一个挂起的过程,我真的想看看它是什么,因为我还没有重现开发中的缺陷.
设想:
我有一个连续运行的 python 进程(直到我们手动停止 - 无限地)并通过每 1 分钟读取某些系统文件来收集数据。当它启动时,它占用大约25 MB。但占用的内存量一天天增加,15天后就超过了500MB。
希望细节足够清楚,更多细节请告诉我,我可以澄清。
更新
我试图按照这个线程显示正在运行的Python应用程序的堆栈跟踪,但我面临以下无法完全解决的错误。
我搜索找到了这样的方法,可以挂钩已经运行的进程并获取堆栈/内存信息。但还没有运气,请帮助我。
具体来说,我正在用Flanicorn中的默认工作人员运行Flask应用程序。我试图弄清楚如何调试/跟踪在处理请求时由于超时导致工作人员死亡的情况。有没有一种方法可以获取堆栈跟踪或配置文件以调试此请求?
python ×10
debugging ×5
daemon ×1
flask ×1
gunicorn ×1
linux ×1
memory ×1
memory-leaks ×1
pdb ×1
performance ×1
process ×1
python-3.x ×1
stack-trace ×1
timeout ×1
zope ×1