精华内容
下载资源
问答
  • python代码调试

    千次阅读 2014-09-07 23:09:20
    pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令,详情...

    http://blog.csdn.net/pipisorry/article/details/45190851

    trace模块可以监控Python执行程序的方式,同时生成一个报表来显示程序的每一行执行的次数。这些信息可以用来发现未被自动化测试集所覆盖的程序执行路径,也可以用来研究程序调用图,进而发现模块之间的依赖关系。编写并执行测试可以发现绝大多数程序中的问题,Python使得debug工作变得更加简单,这是因为在大部分情况下,Python都能够将未被处理的错误打印到控制台中,我们称这些错误信息为traceback。如果程序不是在文本控制台中运行的,traceback也能够将错误信息输出到日志文件或是消息对话框中。当标准的traceback无法提供足够的信息时,可以使用cgitb 模块来查看各级栈和源代码上下文中的详细信息,比如局部变量。cgitb模块还能够将这些跟踪信息以HTML的形式输出,用来报告web应用中的错误。

    一旦发现了问题出在哪里后,就需要使用到交互式调试器进入到代码中进行调试工作了,pdb模块能够很好地胜任这项工作。该模块可以显示出程序在错误产生时的执行路径,同时可以动态地调整对象和代码进行调试。当程序通过测试并调试后,下一步就是要将注意力放到性能上了。开发者可以使用profile以及timit模块来测试程序的速度,找出程序中到底是哪里很慢,进而对这部分代码独立出来进行调优的工作。Python程序是通过解释器执行的,解释器的输入是原有程序的字节码编译版本。这个字节码编译版本可以在程序执行时动态地生成,也可以在程序打包的时候就生成。compileall模块可以处理程序打包的事宜,它暴露出了打包相关的接口,该接口能够被安装程序和打包工具用来生成包含模块字节码的文件。同时,在开发环境中,compileall模块也可以用来验证源文件是否包含了语法错误。

    在源代码级别,pyclbr模块提供了一个类查看器,方便文本编辑器或是其他程序对Python程序中有意思的字符进行扫描,比如函数或者是类。在提供了类查看器以后,就无需引入代码,这样就避免了潜在的副作用影响。

    皮皮Blog


    Python调试器与pdb模块

    Python在pdb模块中包含了一个简单的基于命令行的调试器。pdb模块支持事后调试(post-mortem debugging),栈帧探查(inspection of stack frames),断点(breakpoints),单步调试(single-stepping of source lines)以及代码审查(code evaluation)。

    好几个函数都能够在程序中调用调试器,或是在交互式的Python终端中进行调试工作。

    pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令,详情见表 1。

    pdb 常用命令

    命令解释
    break 或 b 设置断点设置断点
    continue 或 c继续执行程序
    list 或 l查看当前行的代码段
    step 或 s进入函数
    return 或 r执行代码直到从当前函数返回
    exit 或 q中止并退出
    next 或 n执行下一行
    pp打印变量的值
    help帮助


    在所有启动调试器的函数中,函数set_trace()也许是最简易实用的了。如果在复杂程序中发现了问题,可以在代码中插入set_trace()函数,并运行程序。当执行到set_trace()函数时,这就会暂停程序的执行并直接跳转到调试器中,这时候你就可以大展手脚开始检查运行时环境了。当退出调试器时,调试器会自动恢复程序的执行。

    假设你的程序有问题,你想找到一个简单的方法来对它进行调试。

    如果你的程序崩溃时报了一个异常错误,那么你可以用python3 -i someprogram.py这个命令来运行你的程序,这能够很好地发现问题所在。-i选项表明只要程序终结就立即启动一个交互式shell。在这个交互式shell中,你就可以很好地探查到底发生了什么导致程序的错误。例如,如果你有以下代码:

    1
    2
    3
    4
    def  function(n):
         return n + 10
     
    function( "Hello" )

    如果使用python3 -i 命令运行程序就会产生如下输出:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    python3  - i sample.py
    Traceback (most recent call last):
       File "sample.py" , line 4 , in <module>
         function( "Hello" )
       File "sample.py" , line 2 , in function
         return n + 10
    TypeError: Can 't convert ' int ' object to str implicitly
    >>> function( 20 )
    30
    >>>

    如果你没有发现什么明显的错误,那么你可以进一步地启动Python调试器。例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>>  import pdb
    >>> pdb.pm()
    > sample.py( 4 )func()
    - > return n + 10
    (Pdb) w
    sample.py( 6 )<module>()
    - > func( 'Hello' )
    > sample.py( 4 )func()
    - > return n + 10
    (Pdb)  print n
    'Hello'
    (Pdb) q
    >>>

    如果你的代码身处的环境很难启动一个交互式shell的话(比如在服务器环境下),你可以增加错误处理的代码,并自己输出跟踪信息。例如:

    1
    2
    3
    4
    5
    6
    7
    import  traceback
    import  sys
    try :
         func(arg)
    except :
         print ( '**** AN ERROR OCCURRED ****' )
         traceback.print_exc( file = sys.stderr)

    如果你的程序并没有崩溃,而是说程序的行为与你的预期表现的不一致,那么你可以尝试在一些可能出错的地方加入print()函数。如果你打算采用这种方案的话,那么还有些相关的技巧值得探究。首先,函数traceback.print_stack()能够在被执行时立即打印出程序中栈的跟踪信息。例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    >>>  def sample(n):
    ...      if n > 0 :
    ...         sample(n - 1 )
    ...      else :
    ...         traceback.print_stack( file = sys.stderr)
    ...
    >>> sample( 5 )
    File  "<stdin>" , line  1 , in <module>
    File  "<stdin>" , line  3 , in sample
    File "<stdin>" , line 3 , in sample
    File "<stdin>" , line 3 , in sample
    File "<stdin>" , line 3 , in sample
    File "<stdin>" , line 3 , in sample
    File "<stdin>" , line 5 , in sample
    >>>


    可以在程序中任意一处使用pdb.set_trace()手动地启动调试器,就像这样:

    1
    2
    3
    4
    5
    import  pdb
    def  func(arg):
         ...
         pdb.set_trace()
         ...

    在深入解析大型程序的时候,这是一个非常实用的技巧,这样操作能够清楚地了解程序的控制流或是函数的参数。比如,一旦调试器启动了之后,你就可以使用print或者w命令来查看变量,来了解栈的跟踪信息。

    在进行软件调试时,千万不要让事情变得很复杂。有时候仅仅需要知道程序的跟踪信息就能够解决大部分的简单错误(比如,实际的错误总是显示在跟踪信息的最后一行)。在实际的开发过程中,将print()函数插入到代码中也能够很方便地显示调试信息(只需要记得在调试完以后将print语句删除掉就行了)。调试器的通用用法是在崩溃的函数中探查变量的值,知道如何在程序崩溃以后再进入到调试器中就显得非常实用。在程序的控制流不是那么清楚的情况下,你可以插入pdb.set_trace()语句来理清复杂程序的思路。本质上,程序会一直执行直到遇到set_trace()调用,之后程序就会立刻跳转进入到调试器中。在调试器里,你就可以进行更多的尝试。如果你正在使用Python的IDE,那么IDE通常会提供基于pdb的调试接口,你可以查阅IDE的相关文档来获取更多的信息。

    下面是一些Python调试器入门的资源列表:

    1. 阅读Steve Ferb的文章 “Debugging in Python”
    2. 观看Eric Holscher的截图 “Using pdb, the Python Debugger”
    3. 阅读Ayman Hourieh的文章 “Python Debugging Techniques”
    4. 阅读 Python documentation for pdb – The Python Debugger
    5. 阅读Karen Tracey的D jango 1.1 Testing and Debugging一书中的第九章——When You Don’t Even Know What to Log: Using Debuggers

    用Python编写的模块化的GDB可视化前端界面

    [gdb-dashboard:Modular visual interface for GDB in Python]

    Note: GDBDashBoard要比Peda的对程序的监控状态要多些

    皮皮Blog


    使用iPDB调试

    iPDB是一个极好的工具,我已经用它查出了很多匪夷所思的bug。 pip install ipdb 安装该工具,然后在你的代码中 import ipdb; ipdb.set_trace(),然后你会在你的程序运行时,获得一个很好的交互式提示。它每次执行程序的一行并且检查变量。

    python内置了一个很好的追踪模块,帮助我搞清楚发生了什么。这里有一个没什么用的python程序:

    1
    2
    3
    = 1
    = 2
    = b

    这里是对这个程序的追踪结果:

    1
    2
    3
    4
    5
    6
    7
    ( test )jhaddad@jons-mac-pro ~VIRTUAL_ENV /src $ python -m trace --trace tracing.py                                                                                                        1 ↵ 
      --- modulename: tracing, funcname: <module>
    tracing.py(1): a = 1
    tracing.py(2): b = 2
    tracing.py(3): a = b
      --- modulename: trace, funcname: _unsettrace
    trace.py(80):         sys.settrace(None)

    当你想要搞清楚其他程序的内部构造的时候,这个功能非常有用。如果你以前用过strace,它们的工作方式很相像

    在一些场合,我使用pycallgraph来追踪性能问题。它可以创建函数调用时间和次数的图表。

    最后,objgraph对于查找内存泄露非常有用。这里有一篇关于如何使用它查找内存泄露的好文

    [写给已有编程经验的 Python 初学者的总结]


    使用 PyCharm 进行调试

    PyCharm 是由 JetBrains 打造的一款 Python IDE,具有语法高亮、Project 管理、代码跳转、智能提示、自动完成、单元测试、版本控制等功能,同时提供了对 Django 开发以及 Google App Engine 的支持。分为个人独立版和商业版,需要 license 支持,也可以获取免费的 30 天试用。试用版本的 Pycharm 可以在官网上下载,下载地址为:http://www.jetbrains.com/pycharm/download/index.html。 PyCharm 同时提供了较为完善的调试功能,支持多线程,远程调试等,可以支持断点设置,单步模式,表达式求值,变量查看等一系列功能。PyCharm IDE 的调试窗口布局如图 1 所示。

    图 1. PyCharm IDE 窗口布局
    图片示例

    下面结合实例讲述如何利用 PyCharm 进行多线程调试。具体调试所用的代码实例见清单 10。

    清单 10. PyCharm 调试代码实例
    __author__ = 'zhangying'
     #!/usr/bin/python 
     import thread 
     import time 
     # Define a function for the thread 
     def print_time( threadName, delay): 
        count = 0 
        while count <  5: 
            count += 1 
            print "%s: %s" % ( threadName, time.ctime(time.time()) ) 
     def check_sum(threadName,valueA,valueB): 
        print "to calculate the sum of two number her"
        result=sum(valueA,valueB) 
        print "the result is" ,result; 
     def sum(valueA,valueB): 
        if valueA >0 and valueB>0: 
            return valueA+valueB 
     def readFile(threadName, filename): 
        file = open(filename) 
        for line in file.xreadlines(): 
            print line 
     try: 
        thread.start_new_thread( print_time, ("Thread-1", 2, ) ) 
        thread.start_new_thread( check_sum, ("Thread-2", 4,5, ) ) 
        thread.start_new_thread( readFile, ("Thread-3","test.txt",)) 
     except: 
        print "Error: unable to start thread"
     while 1: 
     # 	 print "end"
        pass

    在调试之前通常需要设置断点,断点可以设置在循环或者条件判断的表达式处或者程序的关键点。设置断点的方法非常简单:在代码编辑框中将光标移动到需要设置断点的行,然后直接按 Ctrl+F8 或者选择菜单"Run"->"Toggle Line Break Point",更为直接的方法是双击代码编辑处左侧边缘,可以看到出现红色的小圆点(如图 2)。当调试开始的时候,当前正在执行的代码会直接显示为蓝色。下图中设置了三个断点,蓝色高亮显示的为正在执行的代码。

    图 2. 断点设置
    图片示例 2

    表达式求值:在调试过程中有的时候需要追踪一些表达式的值来发现程序中的问题,Pycharm 支持表达式求值,可以通过选中该表达式,然后选择“Run”->”Evaluate Expression”,在出现的窗口中直接选择 Evaluate 便可以查看。

    Pychar 同时提供了 Variables 和 Watches 窗口,其中调试步骤中所涉及的具体变量的值可以直接在 variable 一栏中查看。

    图 3. 变量查看
    图片示例 3

    如果要动态的监测某个变量可以直接选中该变量并选择菜单”Run”->”Add Watch”添加到 watches 栏中。当调试进行到该变量所在的语句时,在该窗口中可以直接看到该变量的具体值。

    图 4. 监测变量
    图片示例 4

    对于多线程程序来说,通常会有多个线程,当需要 debug 的断点分别设置在不同线程对应的线程体中的时候,通常需要 IDE 有良好的多线程调试功能的支持。 Pycharm 中在主线程启动子线程的时候会自动产生一个 Dummy 开头的名字的虚拟线程,每一个 frame 对应各自的调试帧。如图 5,本实例中一共有四个线程,其中主线程生成了三个线程,分别为 Dummy-4,Dummy-5,Dummy-6. 其中 Dummy-4 对应线程 1,其余分别对应线程 2 和线程 3。

    图 5. 多线程窗口
    图片示例 5

    当调试进入到各个线程的子程序时,Frame 会自动切换到其所对应的 frame,相应的变量栏中也会显示与该过程对应的相关变量,如图 6,直接控制调试按钮,如 setp in,step over 便可以方便的进行调试。

    图 6. 子线程调试

    图片示例 6

    皮皮Blog


    使用日志调试

    日志信息是软件开发过程中进行调试的一种非常有用的方式,特别是在大型软件开发过程需要很多相关人员进行协作的情况下。开发人员通过在代码中加入一些特定的能够记录软件运行过程中的各种事件信息能够有利于甄别代码中存在的问题。这些信息可能包括时间,描述信息以及错误或者异常发生时候的特定上下文信息。最原始的 debug 方法是通过在代码中嵌入 print 语句,通过输出一些相关的信息来定位程序的问题。但这种方法有一定的缺陷,正常的程序输出和 debug 信息混合在一起,给分析带来一定困难,当程序调试结束不再需要 debug 输出的时候,通常没有很简单的方法将 print 的信息屏蔽掉或者定位到文件。python 中自带的 logging 模块可以比较方便的解决这些问题,它提供日志功能,将 logger 的 level 分为五个级别,可以通过 Logger.setLevel(lvl) 来设置。默认的级别为 warning。

    表 2. 日志的级别
    Level使用情形
    DEBUG详细的信息,在追踪问题的时候使用
    INFO正常的信息
    WARNING一些不可预见的问题发生,或者将要发生,如磁盘空间低等,但不影响程序的运行
    ERROR由于某些严重的问题,程序中的一些功能受到影响
    CRITICAL严重的错误,或者程序本身不能够继续运行

    logging lib 包含 4 个主要对象

    • logger:logger 是程序信息输出的接口。它分散在不同的代码中使得程序可以在运行的时候记录相应的信息,并根据设置的日志级别或 filter 来决定哪些信息需要输出并将这些信息分发到其关联的 handler。常用的方法有 Logger.setLevel(),Logger.addHandler() ,Logger.removeHandler() ,Logger.addFilter() ,Logger.debug(), Logger.info(), Logger.warning(), Logger.error(),getLogger() 等。logger 支持层次继承关系,子 logger 的名称通常是父 logger.name 的方式。如果不创建 logger 的实例,则使用默认的 root logger,通过 logging.getLogger() 或者 logging.getLogger("") 得到 root logger 实例。
    • Handler:Handler 用来处理信息的输出,可以将信息输出到控制台,文件或者网络。可以通过 Logger.addHandler() 来给 logger 对象添加 handler,常用的 handler 有 StreamHandler 和 FileHandler 类。StreamHandler 发送错误信息到流,而 FileHandler 类用于向文件输出日志信息,这两个 handler 定义在 logging 的核心模块中。其他的 hander 定义在 logging.handles 模块中,如 HTTPHandler,SocketHandler。
    • Formatter:Formatter 则决定了 log 信息的格式 , 格式使用类似于 %(< dictionary key >)s 的形式来定义,如'%(asctime)s - %(levelname)s - %(message)s',支持的 key 可以在 python 自带的文档 LogRecord attributes 中查看。
    • Filter:Filter 用来决定哪些信息需要输出。可以被 handler 和 logger 使用,支持层次关系,比如如果设置了 filter 为名称为 A.B 的 logger,则该 logger 和其子 logger 的信息会被输出,如 A.B,A.B.C.
    清单 12. 日志使用示例
    import logging 
     LOG1=logging.getLogger('b.c') 
     LOG2=logging.getLogger('d.e') 
     filehandler = logging.FileHandler('test.log','a') 
     formatter = logging.Formatter('%(name)s %(asctime)s %(levelname)s %(message)s') 
     filehandler.setFormatter(formatter) 
     filter=logging.Filter('b') 
     filehandler.addFilter(filter) 
     LOG1.addHandler(filehandler) 
     LOG2.addHandler(filehandler) 
     LOG1.setLevel(logging.INFO) 
     LOG2.setLevel(logging.DEBUG) 
     LOG1.debug('it is a debug info for log1') 
     LOG1.info('normal infor for log1') 
     LOG1.warning('warning info for log1:b.c') 
     LOG1.error('error info for log1:abcd') 
     LOG1.critical('critical info for log1:not worked') 
     LOG2.debug('debug info for log2') 
     LOG2.info('normal info for log2') 
     LOG2.warning('warning info for log2') 
     LOG2.error('error:b.c') 
     LOG2.critical('critical')

    上例设置了 filter b,则 b.c 为 b 的子 logger,因此满足过滤条件该 logger 相关的日志信息会 被输出,而其他不满足条件的 logger(这里是 d.e)会被过滤掉。

    清单 13. 输出结果
    b.c 2011-11-25 11:07:29,733 INFO normal infor for log1 
     b.c 2011-11-25 11:07:29,733 WARNING warning info for log1:b.c 
     b.c 2011-11-25 11:07:29,733 ERROR error info for log1:abcd 
     b.c 2011-11-25 11:07:29,733 CRITICAL critical info for log1:not worked

    logging 的使用非常简单,同时它是线程安全的,下面结合多线程的例子讲述如何使用 logging 进行 debug。

    清单 14. 多线程使用 logging
    logging.conf 
     [loggers] 
     keys=root,simpleExample 
    
     [handlers] 
     keys=consoleHandler 
    
     [formatters] 
     keys=simpleFormatter 
    
     [logger_root] 
     level=DEBUG 
     handlers=consoleHandler 
    
     [logger_simpleExample] 
     level=DEBUG 
     handlers=consoleHandler 
     qualname=simpleExample 
     propagate=0 
    
     [handler_consoleHandler] 
     class=StreamHandler 
     level=DEBUG 
     formatter=simpleFormatter 
     args=(sys.stdout,) 
    
     [formatter_simpleFormatter] 
     format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 
     datefmt= 
    
     code example: 
     #!/usr/bin/python 
     import thread 
     import time 
     import logging 
     import logging.config 
     logging.config.fileConfig('logging.conf') 
     # create logger 
     logger = logging.getLogger('simpleExample') 
     # Define a function for the thread 
     def print_time( threadName, delay): 
    	 logger.debug('thread 1 call print_time function body') 
    	 count = 0 
    	 logger.debug('count:%s',count)


    使用inspect模块调试

    该模块用于调试目的时是非常有用的,它的功能远比这里描述的要多。
    import logging, inspect

    logging.basicConfig(level=logging.INFO,
        format='%(asctime)s %(levelname)-8s %(filename)s:%(lineno)-4d: %(message)s',
        datefmt='%m-%d %H:%M',
        )
    logging.debug('A debug message')
    logging.info('Some information')
    logging.warning('A shot across the bow')

    def test():
        frame,filename,line_number,function_name,lines,index=\
            inspect.getouterframes(inspect.currentframe())[1]
        print(frame,filename,line_number,function_name,lines,index)

    test()

    # Should print the following (with current date/time of course)
    #10-19 19:57 INFO     test.py:9   : Some information
    #10-19 19:57 WARNING  test.py:10  : A shot across the bow
    #(, 'C:/xxx/pyfunc/magic.py', 16, '', ['test()\n'], 0)

    from:http://blog.csdn.net/pipisorry/article/details/45190851

    ref:Python 代码调试技巧

    对正在运行的 Python 进程插入代码


    展开全文
  • Electron的代码调试

    万次阅读 2018-04-09 10:52:33
    刚接触Electron,尝试调试程序时,竟无从下手,所以把这个过程做了下记录 参考工程 根据Electron的官方文档:使用 VSCode 进行主进程调试:https://electronjs.org/docs/tutorial/debugging-main-process-vscode ...

    刚接触Electron,尝试调试程序时,竟无从下手,所以把这个过程做了下记录

    参考工程

    根据Electron的官方文档:使用 VSCode 进行主进程调试:https://electronjs.org/docs/tutorial/debugging-main-process-vscode

    下载相应的github工程:github.com/octref/vscode-electron-debug/tree/master/electron-quick-start

    用VSCode导入工程

    1:安装VSCode

    2:在VSCode的菜单“将文件夹添加到工作区”中把上面的工程导入

    如下图,点左下角的调试选择箭头图标,能看到下面两个选择:

    Debug Main Process(主进程调试)

    Debug Renderer Process(渲染进程调试)

    这两个选择和工程文件夹下的.vscode\launch.json的内容对应,如下图

    VScode调试主进程

    选上图的Debug Main Process,就能使代码停在主进程代码main.js中设置的断点,如下图:

    VScode调试渲染进程

    选上图的Debug Renderer Process,如下面渲染进程代码render.js所示,当你点击程序显示的界面时,会触发click事件,就能使代码停在设置的断点中,如下图:


    在上面的工程中用VSCode调试渲染进程是ok的,但尝试用webpack给代码打包后,发现在代码中设置的断点会停不了,所以接着介绍下面的另一种调试渲染进程的方法

    DevTool调试渲染进程

    在Electron的官方文档中找到另一种调试渲染进程的方法:

    调试应用:https://electronjs.org/docs/tutorial/application-debugging
    注意:此方法只能调试渲染进程

    在主进程的代码main.js处:

    function createWindow () {
      // Create the browser window.
      mainWindow = new BrowserWindow({width: 800, height: 600})
      // and load the index.html of the app.
      mainWindow.loadURL(`file://${__dirname}/index.html`)

    增加mainWindow.webContents.openDevTools();

    如下:

     function createWindow () {
      // Create the browser window.
      mainWindow = new BrowserWindow({width: 800, height: 600})
      mainWindow.webContents.openDevTools();
      // and load the index.html of the app.
      mainWindow.loadURL(`file://${__dirname}/index.html`)

    无论你是用调试的方式,还是用运行任务的方式,只要程序运行起来后,就能在你的程序运行的界面处默认打开如下图右边的Developer Tools调试窗口,和浏览器的F12调试窗口一样。会发现,即使经webpack打包,也能在调试时正常停在断点。

    VScode调试时遇到的问题

    当用electron github首页中介绍的electron/electron-quick-start 时,发现并不能用VScode来调试主进程或渲染进程,即使按提示,把"protocol": "legacy"改为"protocol": "inspector"也是解决不了问题,后来发现此工程用的是"electron": "^1.8.4",而上面用的是"electron": "1.5.1",而用不同的electron版本时,所引用的nodejs的版本也是不一样的,打印的log分别如下:

    We are using Node.js 8.2.1, Chromium 59.0.3071.115, and Electron 1.8.4.

    We are using node 7.4.0, Chromium 54.0.2840.101, and Electron 1.5.1.

    初步怀疑和这个有关。

    如果各位同学有什么解决方法,麻烦给我留个言,谢谢!

    展开全文
  • Python 代码调试技巧

    千次阅读 2019-09-13 15:46:23
    pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令,详情...

    使用 pdb 进行调试

    pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令,详情见表 1。


    表 1. pdb 常用命令
    命令解释
    break 或 b 设置断点设置断点
    continue 或 c继续执行程序
    list 或 l查看当前行的代码段
    step 或 s进入函数
    return 或 r执行代码直到从当前函数返回
    exit 或 q中止并退出
    next 或 n执行下一行
    pp打印变量的值
    help帮助

    下面结合具体的实例讲述如何使用 pdb 进行调试。


    清单 1. 测试代码示例
    import pdb 
     a = "aaa"
     pdb.set_trace() 
     b = "bbb"
     c = "ccc"
     final = a + b + c 
     print final

    开始调试:直接运行脚本,会停留在 pdb.set_trace() 处,选择 n+enter 可以执行当前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重复执行上一条 debug 命令。


    清单 2. 利用 pdb 调试
    [root@rcc-pok-idg-2255 ~]#  python epdb1.py 
     > /root/epdb1.py(4)?() 
     -> b = "bbb"
     (Pdb) n 
     > /root/epdb1.py(5)?() 
     -> c = "ccc"
     (Pdb) 
     > /root/epdb1.py(6)?() 
     -> final = a + b + c 
     (Pdb) list 
      1     import pdb 
      2     a = "aaa"
      3     pdb.set_trace() 
      4     b = "bbb"
      5     c = "ccc"
      6  -> final = a + b + c 
      7     print final 
     [EOF] 
     (Pdb) 
     [EOF] 
     (Pdb) n 
     > /root/epdb1.py(7)?() 
     -> print final 
     (Pdb)

    退出 debug:使用 quit 或者 q 可以退出当前的 debug,但是 quit 会以一种非常粗鲁的方式退出程序,其结果是直接 crash。


    清单 3. 退出 debug
    [root@rcc-pok-idg-2255 ~]#  python epdb1.py 
     > /root/epdb1.py(4)?() 
     -> b = "bbb"
     (Pdb) n 
     > /root/epdb1.py(5)?() 
     -> c = "ccc"
     (Pdb) q 
     Traceback (most recent call last): 
      File "epdb1.py", line 5, in ? 
        c = "ccc"
      File "epdb1.py", line 5, in ? 
        c = "ccc"
      File "/usr/lib64/python2.4/bdb.py", line 48, in trace_dispatch 
        return self.dispatch_line(frame) 
      File "/usr/lib64/python2.4/bdb.py", line 67, in dispatch_line 
        if self.quitting: raise BdbQuit 
     bdb.BdbQuit

    打印变量的值:如果需要在调试过程中打印变量的值,可以直接使用 p 加上变量名,但是需要注意的是打印仅仅在当前的 statement 已经被执行了之后才能看到具体的值,否则会报 NameError: < exceptions.NameError … ....> 错误。


    清单 4. debug 过程中打印变量
    [root@rcc-pok-idg-2255 ~]#  python epdb1.py 
     > /root/epdb1.py(4)?() 
     -> b = "bbb"
     (Pdb) n 
     > /root/epdb1.py(5)?() 
     -> c = "ccc"
     (Pdb) p b 
    'bbb'
     (Pdb) 
    'bbb'
     (Pdb) n 
     > /root/epdb1.py(6)?() 
     -> final = a + b + c 
     (Pdb) p c 
    'ccc'
     (Pdb) p final 
     *** NameError: <exceptions.NameError instance at 0x1551b710 > 
     (Pdb) n 
     > /root/epdb1.py(7)?() 
     -> print final 
     (Pdb) p final 
    'aaabbbccc'
     (Pdb)

    使用 c 可以停止当前的 debug 使程序继续执行。如果在下面的程序中继续有 set_statement() 的申明,则又会重新进入到 debug 的状态,读者可以在代码 print final 之前再加上 set_trace() 验证。


    清单 5. 停止 debug 继续执行程序
    [root@rcc-pok-idg-2255 ~]#  python epdb1.py 
     > /root/epdb1.py(4)?() 
     -> b = "bbb"
     (Pdb) n 
     > /root/epdb1.py(5)?() 
     -> c = "ccc"
     (Pdb) c 
     aaabbbccc

    显示代码:在 debug 的时候不一定能记住当前的代码块,如要要查看具体的代码块,则可以通过使用 list 或者 l 命令显示。list 会用箭头 -> 指向当前 debug 的语句。


    清单 6. debug 过程中显示代码
    [root@rcc-pok-idg-2255 ~]#  python epdb1.py 
     > /root/epdb1.py(4)?() 
     -> b = "bbb"
     (Pdb) list 
      1     import pdb 
      2     a = "aaa"
      3     pdb.set_trace() 
      4  -> b = "bbb"
      5     c = "ccc"
      6     final = a + b + c 
      7     pdb.set_trace() 
      8     print final 
     [EOF] 
     (Pdb) c 
     > /root/epdb1.py(8)?() 
     -> print final 
     (Pdb) list 
      3     pdb.set_trace() 
      4     b = "bbb"
      5     c = "ccc"
      6     final = a + b + c 
      7     pdb.set_trace() 
      8  -> print final 
     [EOF] 
     (Pdb)

    在使用函数的情况下进行 debug


    清单 7. 使用函数的例子
    import pdb 
     def combine(s1,s2):      # define subroutine combine, which... 
        s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, ... 
        s3 = '"' + s3 +'"'   # encloses it in double quotes,... 
        return s3            # and returns it. 
     a = "aaa"
     pdb.set_trace() 
     b = "bbb"
     c = "ccc"
     final = combine(a,b) 
     print final

    如果直接使用 n 进行 debug 则到 final=combine(a,b) 这句的时候会将其当做普通的赋值语句处理,进入到 print final。如果想要对函数进行 debug 如何处理呢 ? 可以直接使用 s 进入函数块。函数里面的单步调试与上面的介绍类似。如果不想在函数里单步调试可以在断点处直接按 r 退出到调用的地方。


    清单 8. 对函数进行 debug
    [root@rcc-pok-idg-2255 ~]# python epdb2.py 
     > /root/epdb2.py(10)?() 
     -> b = "bbb"
     (Pdb) n 
     > /root/epdb2.py(11)?() 
     -> c = "ccc"
     (Pdb) n 
     > /root/epdb2.py(12)?() 
     -> final = combine(a,b) 
     (Pdb) s 
     --Call-- 
     > /root/epdb2.py(3)combine() 
     -> def combine(s1,s2):      # define subroutine combine, which... 
     (Pdb) n 
     > /root/epdb2.py(4)combine() 
     -> s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, ... 
     (Pdb) list 
      1     import pdb 
      2 
      3     def combine(s1,s2):      # define subroutine combine, which... 
      4  ->     s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, ... 
      5         s3 = '"' + s3 +'"'   # encloses it in double quotes,... 
      6         return s3            # and returns it. 
      7 
      8     a = "aaa"
      9     pdb.set_trace() 
     10     b = "bbb"
     11     c = "ccc"
     (Pdb) n 
     > /root/epdb2.py(5)combine() 
     -> s3 = '"' + s3 +'"'   # encloses it in double quotes,... 
     (Pdb) n 
     > /root/epdb2.py(6)combine() 
     -> return s3            # and returns it. 
     (Pdb) n 
     --Return-- 
     > /root/epdb2.py(6)combine()->'"aaabbbaaa"'
     -> return s3            # and returns it. 
     (Pdb) n 
     > /root/epdb2.py(13)?() 
     -> print final 
     (Pdb)

    在调试的时候动态改变值 。在调试的时候可以动态改变变量的值,具体如下实例。需要注意的是下面有个错误,原因是 b 已经被赋值了,如果想重新改变 b 的赋值,则应该使用! B。


    清单 9. 在调试的时候动态改变值
    [root@rcc-pok-idg-2255 ~]# python epdb2.py 
     > /root/epdb2.py(10)?() 
     -> b = "bbb"
     (Pdb) var = "1234"
     (Pdb) b = "avfe"
     *** The specified object '= "avfe"' is not a function 
     or was not found along sys.path. 
     (Pdb) !b="afdfd"
     (Pdb)

    pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具。接下来将介绍 PyCharm IDE 的调试方法 .

    使用 PyCharm 进行调试

    PyCharm 是由 JetBrains 打造的一款 Python IDE,具有语法高亮、Project 管理、代码跳转、智能提示、自动完成、单元测试、版本控制等功能,同时提供了对 Django 开发以及 Google App Engine 的支持。分为个人独立版和商业版,需要 license 支持,也可以获取免费的 30 天试用。试用版本的 Pycharm 可以在官网上下载,下载地址为:http://www.jetbrains.com/pycharm/download/index.html。 PyCharm 同时提供了较为完善的调试功能,支持多线程,远程调试等,可以支持断点设置,单步模式,表达式求值,变量查看等一系列功能。PyCharm IDE 的调试窗口布局如图 1 所示。


    图 1. PyCharm IDE 窗口布局
    图片示例  

    下面结合实例讲述如何利用 PyCharm 进行多线程调试。具体调试所用的代码实例见清单 10。


    清单 10. PyCharm 调试代码实例
    __author__ = 'zhangying'
     #!/usr/bin/python 
     import thread 
     import time 
     # Define a function for the thread 
     def print_time( threadName, delay): 
        count = 0 
        while count <  5: 
            count += 1 
            print "%s: %s" % ( threadName, time.ctime(time.time()) ) 
     def check_sum(threadName,valueA,valueB): 
        print "to calculate the sum of two number her"
        result=sum(valueA,valueB) 
        print "the result is" ,result; 
     def sum(valueA,valueB): 
        if valueA >0 and valueB>0: 
            return valueA+valueB 
     def readFile(threadName, filename): 
        file = open(filename) 
        for line in file.xreadlines(): 
            print line 
     try: 
        thread.start_new_thread( print_time, ("Thread-1", 2, ) ) 
        thread.start_new_thread( check_sum, ("Thread-2", 4,5, ) ) 
        thread.start_new_thread( readFile, ("Thread-3","test.txt",)) 
     except: 
        print "Error: unable to start thread"
     while 1: 
     # 	 print "end"
        pass

    在调试之前通常需要设置断点,断点可以设置在循环或者条件判断的表达式处或者程序的关键点。设置断点的方法非常简单:在代码编辑框中将光标移动到需要设置断点的行,然后直接按 Ctrl+F8 或者选择菜单"Run"->"Toggle Line Break Point",更为直接的方法是双击代码编辑处左侧边缘,可以看到出现红色的小圆点(如图 2)。当调试开始的时候,当前正在执行的代码会直接显示为蓝色。下图中设置了三个断点,蓝色高亮显示的为正在执行的代码。


    图 2. 断点设置
    图片示例 2  

    表达式求值:在调试过程中有的时候需要追踪一些表达式的值来发现程序中的问题,Pycharm 支持表达式求值,可以通过选中该表达式,然后选择“Run”->”Evaluate Expression”,在出现的窗口中直接选择 Evaluate 便可以查看。

    Pychar 同时提供了 Variables 和 Watches 窗口,其中调试步骤中所涉及的具体变量的值可以直接在 variable 一栏中查看。


    图 3. 变量查看
    图片示例 3  

    如果要动态的监测某个变量可以直接选中该变量并选择菜单”Run”->”Add Watch”添加到 watches 栏中。当调试进行到该变量所在的语句时,在该窗口中可以直接看到该变量的具体值。


    图 4. 监测变量
    图片示例 4  

    对于多线程程序来说,通常会有多个线程,当需要 debug 的断点分别设置在不同线程对应的线程体中的时候,通常需要 IDE 有良好的多线程调试功能的支持。 Pycharm 中在主线程启动子线程的时候会自动产生一个 Dummy 开头的名字的虚拟线程,每一个 frame 对应各自的调试帧。如图 5,本实例中一共有四个线程,其中主线程生成了三个线程,分别为 Dummy-4,Dummy-5,Dummy-6. 其中 Dummy-4 对应线程 1,其余分别对应线程 2 和线程 3。


    图 5. 多线程窗口
    图片示例 5  

    当调试进入到各个线程的子程序时,Frame 会自动切换到其所对应的 frame,相应的变量栏中也会显示与该过程对应的相关变量,如图 6,直接控制调试按钮,如 setp in,step over 便可以方便的进行调试。


    图 6. 子线程调试
    图片示例 6  

    查看大图

    使用 PyDev 进行调试

    PyDev 是一个开源的的 plugin,它可以方便的和 Eclipse 集成,提供方便强大的调试功能。同时作为一个优秀的 Python IDE 还提供语法错误提示、源代码编辑助手、Quick Outline、Globals Browser、Hierarchy View、运行等强大功能。下面讲述如何将 PyDev 和 Eclipse 集成。在安装 PyDev 之前,需要先安装 Java 1.4 或更高版本、Eclipse 以及 Python。 第一步:启动 Eclipse,在 Eclipse 菜单栏中找到 Help 栏,选择 Help > Install New Software,并选择 Add button,添加 Ptdev 的下载站点 http://pydev.org/updates。选择 PyDev 之后完成余下的步骤便可以安装 PyDev。


    图 7. 安装 PyDev
    图片示例 7  

    安装完成之后需要配置 Python 解释器,在 Eclipse 菜单栏中,选择 Window > Preferences > Pydev > Interpreter – Python。Python 安装在 C:\Python27 路径下。单击 New,选择 Python 解释器 python.exe,打开后显示出一个包含很多复选框的窗口,选择需要加入系统 PYTHONPATH 的路径,单击 OK。


    图 8. 配置 PyDev
    图片示例 8  

    在配置完 Pydev 之后,可以通过在 Eclipse 菜单栏中,选择 File > New > Project > Pydev >Pydev Project,单击 Next 创建 Python 项目,下面的内容假设 python 项目已经创建,并且有个需要调试的脚本 remote.py(具体内容如下),它是一个登陆到远程机器上去执行一些命令的脚本,在运行的时候需要传入一些参数,下面将详细讲述如何在调试过程中传入参数 .


    清单 11. Pydev 调试示例代码
    #!/usr/bin/env python 
     import os 	 
     def telnetdo(HOST=None, USER=None, PASS=None, COMMAND=None): #define a function 
    	 import telnetlib, sys 
    	 if not HOST: 
    		 try: 
    			 HOST = sys.argv[1] 
    			 USER = sys.argv[2] 
    			 PASS = sys.argv[3] 
    			 COMMAND = sys.argv[4] 
    		 except: 
    			 print "Usage: remote.py host user pass command"
    			 return 
    	 tn = telnetlib.Telnet() # 
    	 try: 
    		 tn.open(HOST) 
    	 except: 
    		 print "Cannot open host"
    		 return 
    	 tn.read_until("login:") 
    	 tn.write(USER + '\n') 
    	 if PASS: 
    		 tn.read_until("Password:") 
    		 tn.write(PASS + '\n') 
    		 tn.write(COMMAND + '\n') 
    		 tn.write("exit\n") 
    		 tmp = tn.read_all() 
    		 tn.close() 
    		 del tn 
    		 return tmp 
    		
     if __name__ == '__main__': 
    	 print telnetdo()

    在调试的时候有些情况需要传入一些参数,在调试之前需要进行相应的配置以便接收所需要的参数,选择需要调试的程序(本例 remote.py),该脚本在 debug 的过程中需要输入四个参数:host,user,password 以及命令。在 eclipse 的工程目录下选择需要 debug 的程序,单击右键,选择“Debug As”->“Debug Configurations”,在 Arguments Tab 页中选择“Variables”。如下 图 9 所示 .


    图 9. 配置变量
    图片示例 9  

    在窗口”Select Variable”之后选择“Edit Varuables” ,出现如下窗口,在下图中选择”New” 并在弹出的窗口中输入对应的变量名和值。特别需要注意的是在值的后面一定要有空格,不然所有的参数都会被当做第一个参数读入。


    图 10. 添加具体变量
    图片示例 10  

    按照以上方式依次配置完所有参数,然后在”select variable“窗口中安装参数所需要的顺序依次选择对应的变量。配置完成之后状态如下图 11 所示。


    图 11. 完成配置
    图片示例 11  

    选择 Debug 便可以开始程序的调试,调试方法与 eclipse 内置的调试功能的使用相似,并且支持多线程的 debug,这方面的文章已经有很多,读者可以自行搜索阅读,或者参考”使用 Eclipse 平台进行调试“一文。

    使用日志功能达到调试的目的

    日志信息是软件开发过程中进行调试的一种非常有用的方式,特别是在大型软件开发过程需要很多相关人员进行协作的情况下。开发人员通过在代码中加入一些特定的能够记录软件运行过程中的各种事件信息能够有利于甄别代码中存在的问题。这些信息可能包括时间,描述信息以及错误或者异常发生时候的特定上下文信息。 最原始的 debug 方法是通过在代码中嵌入 print 语句,通过输出一些相关的信息来定位程序的问题。但这种方法有一定的缺陷,正常的程序输出和 debug 信息混合在一起,给分析带来一定困难,当程序调试结束不再需要 debug 输出的时候,通常没有很简单的方法将 print 的信息屏蔽掉或者定位到文件。python 中自带的 logging 模块可以比较方便的解决这些问题,它提供日志功能,将 logger 的 level 分为五个级别,可以通过 Logger.setLevel(lvl) 来设置。默认的级别为 warning。


    表 2. 日志的级别
    Level使用情形
    DEBUG详细的信息,在追踪问题的时候使用
    INFO正常的信息
    WARNING一些不可预见的问题发生,或者将要发生,如磁盘空间低等,但不影响程序的运行
    ERROR由于某些严重的问题,程序中的一些功能受到影响
    CRITICAL严重的错误,或者程序本身不能够继续运行

    logging lib 包含 4 个主要对象

    • logger:logger 是程序信息输出的接口。它分散在不同的代码中使得程序可以在运行的时候记录相应的信息,并根据设置的日志级别或 filter 来决定哪些信息需要输出并将这些信息分发到其关联的 handler。常用的方法有 Logger.setLevel(),Logger.addHandler() ,Logger.removeHandler() ,Logger.addFilter() ,Logger.debug(), Logger.info(), Logger.warning(), Logger.error(),getLogger() 等。logger 支持层次继承关系,子 logger 的名称通常是父 logger.name 的方式。如果不创建 logger 的实例,则使用默认的 root logger,通过 logging.getLogger() 或者 logging.getLogger("") 得到 root logger 实例。
    • Handler:Handler 用来处理信息的输出,可以将信息输出到控制台,文件或者网络。可以通过 Logger.addHandler() 来给 logger 对象添加 handler,常用的 handler 有 StreamHandler 和 FileHandler 类。StreamHandler 发送错误信息到流,而 FileHandler 类用于向文件输出日志信息,这两个 handler 定义在 logging 的核心模块中。其他的 hander 定义在 logging.handles 模块中,如 HTTPHandler,SocketHandler。
    • Formatter:Formatter 则决定了 log 信息的格式 , 格式使用类似于 %(< dictionary key >)s 的形式来定义,如'%(asctime)s - %(levelname)s - %(message)s',支持的 key 可以在 python 自带的文档 LogRecord attributes 中查看。
    • Filter:Filter 用来决定哪些信息需要输出。可以被 handler 和 logger 使用,支持层次关系,比如如果设置了 filter 为名称为 A.B 的 logger,则该 logger 和其子 logger 的信息会被输出,如 A.B,A.B.C.

    清单 12. 日志使用示例
    import logging 
     LOG1=logging.getLogger('b.c') 
     LOG2=logging.getLogger('d.e') 
     filehandler = logging.FileHandler('test.log','a') 
     formatter = logging.Formatter('%(name)s %(asctime)s %(levelname)s %(message)s') 
     filehandler.setFormatter(formatter) 
     filter=logging.Filter('b') 
     filehandler.addFilter(filter) 
     LOG1.addHandler(filehandler) 
     LOG2.addHandler(filehandler) 
     LOG1.setLevel(logging.INFO) 
     LOG2.setLevel(logging.DEBUG) 
     LOG1.debug('it is a debug info for log1') 
     LOG1.info('normal infor for log1') 
     LOG1.warning('warning info for log1:b.c') 
     LOG1.error('error info for log1:abcd') 
     LOG1.critical('critical info for log1:not worked') 
     LOG2.debug('debug info for log2') 
     LOG2.info('normal info for log2') 
     LOG2.warning('warning info for log2') 
     LOG2.error('error:b.c') 
     LOG2.critical('critical')

    上例设置了 filter b,则 b.c 为 b 的子 logger,因此满足过滤条件该 logger 相关的日志信息会 被输出,而其他不满足条件的 logger(这里是 d.e)会被过滤掉。


    清单 13. 输出结果
    b.c 2011-11-25 11:07:29,733 INFO normal infor for log1 
     b.c 2011-11-25 11:07:29,733 WARNING warning info for log1:b.c 
     b.c 2011-11-25 11:07:29,733 ERROR error info for log1:abcd 
     b.c 2011-11-25 11:07:29,733 CRITICAL critical info for log1:not worked

    logging 的使用非常简单,同时它是线程安全的,下面结合多线程的例子讲述如何使用 logging 进行 debug。


    清单 14. 多线程使用 logging
    logging.conf 
     [loggers] 
     keys=root,simpleExample 
    
     [handlers] 
     keys=consoleHandler 
    
     [formatters] 
     keys=simpleFormatter 
    
     [logger_root] 
     level=DEBUG 
     handlers=consoleHandler 
    
     [logger_simpleExample] 
     level=DEBUG 
     handlers=consoleHandler 
     qualname=simpleExample 
     propagate=0 
    
     [handler_consoleHandler] 
     class=StreamHandler 
     level=DEBUG 
     formatter=simpleFormatter 
     args=(sys.stdout,) 
    
     [formatter_simpleFormatter] 
     format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 
     datefmt= 
    
     code example: 
     #!/usr/bin/python 
     import thread 
     import time 
     import logging 
     import logging.config 
     logging.config.fileConfig('logging.conf') 
     # create logger 
     logger = logging.getLogger('simpleExample') 
     # Define a function for the thread 
     def print_time( threadName, delay): 
    	 logger.debug('thread 1 call print_time function body') 
    	 count = 0 
    	 logger.debug('count:%s',count)

    总结

    全文介绍了 python 中 debug 的几种不同的方式,包括 pdb 模块、利用 PyDev 和 Eclipse 集成进行调试、PyCharm 以及 Debug 日志进行调试,希望能给相关 python 使用者一点参考。更多关于 python debugger 的资料可以参见参考资料。


    参考资料

    学习

    讨论

    转载于:https://my.oschina.net/taisha/blog/56703

    展开全文
  • PHP 代码调试跟踪工具 Ytrace

    千次阅读 2017-11-28 10:02:09
    Ytrace是一个PHP代码调试跟踪工具,通过将PHP代码执行过程记录到文件中,再通过webui界面展示出来,并且支持单步调试的方式去查看执行过程。 主要特性: 可以可视化的看到源码文件哪些行被执行了 通过点击行号,...

    Ytrace是一个PHP代码调试跟踪工具,通过将PHP代码执行过程记录到文件中,再通过webui界面展示出来,并且支持单步调试的方式去查看执行过程。
    主要特性:

    • 可以可视化的看到源码文件哪些行被执行了
    • 通过点击行号,直接将执行跳转到对应的地方
    • 根据单步历史,往回执行
    • 设置断点

    该调试工具由三部分组成:

    source

    展开全文
  • 代码片段: //first thing first,登记,否则后面的代码不报错,但是也不记录事件 long GUID = 0x9c805919833654d6L; EventLogger.register(GUID,“LMLogger“,EventLogger.VIEWER_STRING); //记录事件 String ...
  • Python代码调试

    千次阅读 2018-11-01 14:15:28
    有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。 第一种方法简单直接粗暴有效,就是用print()把...
  • 使用vscode进行远程服务器代码调试

    千次阅读 2019-07-22 16:07:45
    使用vscode进行远程服务器代码调试 使用了一段时间的vscode对服务器上的tensorflow代码进行调试,基本常用的功能摸索了一下,这里做一个总结记录。 1. 准备 主机、服务器安装ssh 将主机的ssh id_rsa.pub 写入...
  • Android Studio Java代码调试及NDK调试

    千次阅读 2018-01-24 14:11:13
    Android Studio Java代码调试 debug模式断点调试 写一个简单的调试程序,我们先来一个for循环; 设置断点(点击红点位置添加或取消断点) 点击debug模式运行 查看调试面板 简单调试 ...
  • LS1046A 调试记录

    千次阅读 2018-06-26 16:19:00
    准备写一个系列的调试过程记录,希望通过这些记录能为大家提供一些帮助,粗知浅见也希望大家不吝赐教!~初识LS1046A(一) QorIQ LS1046A是NXP LS系列中的一款高端ARM,具有4个ARM V8 Cortex A72核,最高可以跑...
  • 前端获取后端本地代码调试之路

    千次阅读 2019-08-29 17:57:08
    前端获取后端本地代码调试之路 本人刚入码圈的第一年时光,平时记录下自己工作中遇到的问题,顺便给大家分享一下解决方式~ 请多多指教交流 *_* 与前端的联调 因为项目是前后分离的,要与前端进行接口联调,想在...
  • idea代码调试debug

    千次阅读 2016-05-31 20:55:45
    记录点点滴滴, 断点的设定和eclipse一样,只要点一下就可以, F9 resume programe 恢复程序 Alt+F10 show execution point 显示执行断点 F8 Step Over 相当于eclipse的f6 跳到下一步 F7 ...
  • ROS功能程序调试记录

    千次阅读 2017-07-12 11:12:08
    编写自己的功能程序包或者应用已有程序包,在此基础上改进的过程中都需要进行调试。这里记录如何调试记录程序的步骤,以备后查。--2017.07.12 乐调试
  • 记录一次自己调试代码的过程

    千次阅读 2018-12-20 22:35:47
    今天,现场人员反馈说:“解析的数据出现问题”,所以我在这里把调试代码的过程做个记录,以方便大家的参考。现场发回的数据如下图所示: 我们要做的就是对这些数据进行拆分,得到满足规约的数据,然后进行解析。 ...
  • Python代码调试的几种方法总结

    千次阅读 2017-03-21 22:27:47
    Python代码调试的几种方法总结 投稿:goldensun 字体:[增加 减小] 类型:转载 时间:2015-04-15 我要评论 这篇文章主要介绍了Python代码调试的几种方法总结,本文来自于IBM官方网站技术文档,需要的朋友可以...
  • pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令,详情...
  • ReactNative 代码调试方法

    万次阅读 多人点赞 2016-04-05 20:17:06
    有些时候会通过NSLog进行代码结果的打印,这种方式对应到RN的开发中,就是通过alert()或者通过console.log()把需要的内容弹出或者将结果打印到控制台上。这种方式对于小型的JS脚本调试比较方便。RN中提供了Chrome的...
  • openwrt wifi调试记录

    千次阅读 2018-03-15 11:37:40
    本人从事系统及驱动开发,看看内核代码移植一些驱动还是比较得心应手的,因此本文不记录wifi驱动的调试,而是记录wifi应用的开发。  年末将至,回望这三年工作经历,尽心尽力,自觉能力上从事一些系统及驱动开发...
  • LLVM的源代码调试

    千次阅读 2017-03-31 13:09:40
    它描述了LLVM调试信息采用的实际形式,这对哪些关心创建前端或直接处理这些信息的人是有用的。另外,本文提供了C/C++调试信息看起来像什么的具体例子 LLVM调试信息背后的哲学 LLVM调试信息的思
  • onvif学习6-代码调试

    千次阅读 2013-05-08 11:08:03
    1、打开onvif调试开关,以便让onvif打印一些可用的调试信息。 在Makefile中添加调试宏定义如: CC = gcc -DDEBUG ...RECV.log是onvif接收到的SOAP数据,没接收一条,都会在RECV.log中记录 SENT.lo
  • 微软的代码调试准则

    千次阅读 2007-10-10 14:25:00
    微软的代码调试准则陈能技2007-10-10今天在查阅MSDN帮助文档时偶然发现Visual Studio Team System对程序员的代码调试提出了一些指导原则,用户帮助程序员了解调试需要掌握的技巧和需要注意的行为规范。其中指出:...
  • 香草冰淇淋和代码调试

    万次阅读 热门讨论 2011-07-01 17:21:00
    //=====================================================================//TITLE:// 香草冰淇淋和代码调试//AUTHOR:// norains//DATE:// Friday 01-July-2011//Environment:// Keil MDK 4.2// STM32F207//=
  • 指纹识别调试记录

    千次阅读 2015-02-28 14:20:08
    指纹识别调试记录因为按压式指纹识别都没有量产,原厂代码仍在调试阶段,拿到的是不完善版本。 配置GPIO. 涉及到6个GPIO: spi_cs , clk,mo ,mi, rst, INT. 飞线浪费了很多时间。还有一个是这个芯片有2个电源,1.8V...
  • 1,首先在unity中管理visual studio打开代码 如图打开 打开后修改为编辑软件打开,如图 2.配置visual studio中对unity的支持 打开visual studio,我的是2019版本,如图点击 然后看自己的unity tools(图...
  • Tensorflow 代码调试过程出现问题及解决方法 @(monkey) 一. 错误 初学者很容易犯很多错误 记录一下 1.slice indices must be integers or None or have an index method #定义这样图 with tf.name_...
  • Google Chrome控制台为开发者提供了网页和应用程序调试的几种方法,本文通过基本...按下Chrome界面右上方的Chrome代码调试(一)" TITLE="Console的使用——Google Chrome代码调试(一)" />按钮,选择菜单:更多工具
  • android源代码调试——日志的查看

    万次阅读 2011-08-17 21:04:39
    想对android源代码进行调试,或者对android某个模块需要进行流程上的研究,这时候查看日志是必不可少的。但是就系统给出的日志来说太少了,很难进行跟踪。那么如何才能让系统给出更多的日志呢。对源代码进行研究就好...
  • SSD2828调试记录

    万次阅读 热门讨论 2014-09-17 22:31:47
    最近用SSD2828驱动小米屏,没有代码,没有技术支持,自己写代码反复调试,整死我了,目前已经能正常显示图片,做个总线跟大家分享一下,说的不对的地方欢迎大家批评指正. 要点: 1. 小米3屏的分辨率是1920*1080, 24...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 318,339
精华内容 127,335
关键字:

代码调试记录