精华内容
下载资源
问答
  • 用 Xdebug 修正 PHP 应用程序中错误

    千次阅读 2014-07-05 16:17:50
    如果需要打印超全局变量数组的所有值,请使用号 ( * ),例如  xdebug.dump_REQUEST=* 。如果进一步将 xdebug.dump_undefined  设为  On  并且不设定指定的超全局变量,则仍用值  undefined  打印变量。 ...

    虽然您可以使用 PHP 为系统管理和传统数据处理之类的任务创建命令行脚本,但是编程语言对 Web 应用程序的性能有主要影响。在使用过程中,每个 PHP 应用程序都驻留在服务器上,并且将通过代理(例如 Apache)调用 PHP 应用程序处理到来的请求。对于每个请求,典型的 PHP Web 应用程序在简短运行后将得到一个 Web 页面或 XML 数据结构。

    假定经过简单的运行后,一个分层构造的 Web 应用程序 —— 包括客户机、网络、HTTP 服务器、应用程序代码和底层数据库 —— 将会很难隔离 PHP 代码中的错误。即使假定除了 PHP 代码以外所有层都可以正常运行,跟踪 PHP 代码中的错误也会非常难,尤其是在应用程序利用较多的类时更是如此。

    PHP 语句 echo 和函数 var_dump()debug_zval_dump() 和 print_r() 都是常见且流行的调试辅助工具,可以帮助解决多种问题。但是,这些语句 —— 甚至更健壮的工具,例如 PEAR Log package —— 都是取证工具,必须在上下文环境之外先进行推测分析才能生成证据。

    在某种程度上,通过推论进行调试是一种蛮干的做法。收集并筛选数据,尝试推论出发生的问题。如果缺少重要信息,则必须重新测试代码、重复执行步骤,然后重新开始研究。一种更加高效的方法是 程序运行时探测应用程序。您可以对请求参数分类,筛选过程调用堆栈,并查询任何所需的变量或对象。您可以暂时中断应用程序并且可以在变量更改值时收到警报。在某些情况下,您可以通过交互式询问 “如果……会怎样?” 问题来实际影响变量。

    称为调试器 的特殊应用程序支持这种 “实时的” 或交互式的检查。调试器可能启动并连接到进程上以便控制进程并监测其内存。或者,在使用解释语言的情况下,调试器可以直接解释代码。典型的现代图形化调试器可以索引并浏览代码,以符合人类阅读习惯的形式轻松地显示复杂的数据结构,并同时显示程序状态,如调用堆栈、中间输出和所有变量的值。例如,调试器通常都会把类的属性和方法分类并进行描述。

    在本文和下一篇文章中,我将介绍的工具一定能够简化 PHP 调试。下一次,我将主要介绍交互式调试和 Zend Debugger —— 一个特别针对 PHP 的健壮调试器 —— 并探究它提供的许多功能。(Zend Debugger 是一款商业产品,是 Zend PHP 集成开发环境(IDE)的一部分)。我还将介绍一款开源 PHP 调试器,以免您只愿把钱花在啤酒上,而不是花在代码上。但是,本文将主要介绍如何更好地取证。

    类似《犯罪现场调查》,只是更令人讨厌

    代码出错、未能生成某个所需结果或者彻底崩溃时,您需要回答四个 w 问题:where、what、why 和 when:

    • where” 是应用程序最后一次正常运行时所在的文件和行号。
    • what” 是犯错的代码 —— 比如说,嫌疑犯。
    • why” 是错误的本质。可能它是一个逻辑错误和/或与操作系统进行交互所导致的错误,或两者兼具。
    • 而 “when” 是出现错误时的上下文。在程序终止前发生了什么情况?像在所有犯罪行为中一样,如果您可以收集到足够的线索,那么线索就可以帮助您找到犯人。

    一种取证工具 Xdebug(上一篇文章中使用的工具,用于分析 PHP 应用程序性能),如名称所示,将提供几个说明程序状态的功能,并且是应当添加到指令系统中的价值颇高的研究工具(请参阅 参考资料)。安装后,Xdebug 将阻止无限次递归(表面上是这样)、修正关于堆栈跟踪和函数跟踪的错误消息以及监视内存分配,并提供其他功能。Xdebug 还包括一组函数,您可以将这组函数添加到代码中以进行运行时错误诊断。

    例如,下面的代码将使用一些 xdebug_...() 步骤测试 callee() 函数,以便输出调用程序的具体位置,包括文件名、行号和调用函数的名称。

    清单 1. 测试 callee() 函数的步骤
    <?php
        function callee( $a ) {
            echo sprintf("callee() called @ %s: %s from %s",
                xdebug_call_file(),
                xdebug_call_line(),
                xdebug_call_function()
            );
        }
    
        $result = callee( "arg" );
    ?>

    这段代码将生成:

    callee() called @ /var/www/catalog/xd.php: 10 from {main}

    构建和安装 Xdebug

    Xdebug 可以很轻松地从 UNIX® 类操作系统(包括 Mac OS X)中的源代码构建。如果是在 Microsoft® Windows® 上使用 PHP,则可以从 Xdebug Web 站点下载最新 PHP 版本的二进制 Xdebug 模块(请参阅 参考资料)。

    让我们来构建和安装适用于 Debian “Sarge” Linux® 和 PHP V4.3.10-19 的 Xdebug。在撰写本文时,Xdebug 的最新版本是 V2.0.0RC4,发布于 2007 年 5 月 17 日。要继续本文,必须拥有 phpize 和 php-config 实用程序,并且必须能够编辑系统的 php.ini 配置文件(如果没有实用程序,请访问 PHP.net 以获得如何从头构建 PHP 的源代码和说明)。请执行以下步骤:

    1. 下载 Xdebug tarball(一个用 gzip 压缩的 .tar 归档文件)。wget 命令可以帮助您轻松地完成此操作:
       $ wget http://www.xdebug.org/files/xdebug-2.0.0RC4.tgz
    2. 解压缩该 tarball 并切换到源代码目录:
      $ tar xzf xdebug-2.0.0RC4.tgz
      $ cd xdebug-2.0.0RC4
    3. 运行 phpize 以准备适用于您的 PHP 版本的 Xdebug 代码:
      $ phpize
      Configuring for:
      PHP Api Version:         20020918
      Zend Module Api No:      20020429
      Zend Extension Api No:   20021010
      phpize 的输出是一个脚本 —— 通常名为配置 —— 用于调整其余的构建过程。
    4. 运行配置脚本:
      $ ./configure
      checking build system type... i686-pc-linux-gnu
      checking host system type... i686-pc-linux-gnu
      checking for gcc... gcc
      checking for C compiler default output file name... a.out
      checking whether the C compiler works... yes
      checking whether we are cross compiling... no
      checking for suffix of executables... 
      checking for suffix of object files... o
      ...
      checking whether stripping libraries is possible... yes
      appending configuration tag "F77" to libtool
      configure: creating ./config.status
      config.status: creating config.h
    5. 通过运行 make 构建 Xdebug 扩展:
      $ make
      /bin/sh /home/strike/tmp/xdebug-2.0.0RC4/libtool
      --mode=compile gcc  -I.
      -I/home/strike/tmp/xdebug-2.0.0RC4 -DPHP_ATOM_INC
      -I/home/strike/tmp/xdebug-2.0.0RC4/include
      -I/home/strike/tmp/xdebug-2.0.0RC4/main
      -I/home/strike/tmp/xdebug-2.0.0RC4
      -I/usr/include/php4 -I/usr/include/php4/main
      -I/usr/include/php4/Zend -I/usr/include/php4/TSRM 
      -DHAVE_CONFIG_H  -g -O0 -c
      /home/strike/tmp/xdebug-2.0.0RC4/xdebug.c -o
      xdebug.lo mkdir .libs
      ...
      
      Build complete.
      (It is safe to ignore warnings about tempnam and tmpnam).

      使用 make 将生成 Xdebug 扩展 xdebug.so。
    6. 安装该扩展:
      $ sudo make install
      Installing shared extensions:     /usr/lib/php4/20020429/

      继续之前,使用鼠标选择并复制上一条命令显示的目录。该路径对于最后一步配置扩展至关重要。
    7. 在您喜欢的文本编辑器中打开 php.ini 文件,然后添加以下代码:
      zend_extension = /usr/lib/php4/20020429/xdebug.so
      xdebug.profiler_enable = Off
      xdebug.default_enable = On

      第一行将装入 Xdebug 扩展第二行将禁用 Xdebug 的分析器功能(只是为了简单起见),而第三行将启用扩展的调试功能

    要检验 Xdebug 扩展是否已经安装并启用,请重新启动 Web 服务器,然后用代码 <?php phpinfo(); ?> 创建简单的一行 PHP 应用程序。如果将浏览器指向文件 —— 如 http://localhost/phpinfo.php —— 并向下滚动,您应当会看到类似图 1 所示的内容。

    图 1. 检验 Xdebug 扩展是否已经安装并运行
    Xdebug 扩展已启用

    注:如果您在 phpinfo() 的输出中没有看到 Xdebug 部分,则 Xdebug 装入失败。Apache 错误日志会列出原因。常见错误包括zend_extension 的路径错误或者与其他扩展发生冲突。例如,如果需要使用 XCache 和 Xdebug,一定要先装入 XCache。但是,由于 Xdebug 适于在开发时使用并假定 xdebug.so 的路径正确,因此需要禁用其他扩展并重试。然后您可以重新启用扩展以执行其他测试,如缓存的效果。Xdebug 站点还有其他一些故障检修技巧。

    配置 Xdebug

    指令(图 1 中大表的最左侧一列)是一些可以设定的参数,用于改变 Xdebug 扩展的行为。可在 php.ini 文件中设置所有指令。一些指令用于配置调试工具;其他指令用于调整分析器的操作。忽略后者,让我们用一些合理设置来配置 Xdebug 以帮助调试 PHP 代码。

    限制递归

    如果应用程序使用递归 —— 例如,计算斐波纳契数列 —— 并且终端环境不正确,应用程序会运行很长一段时间后才用尽内存或超时。您可以设定 xdebug.max_nesting_level 参数来限定递归深度。例如,xdebug.max_nesting_level = 50 将把递归深度限定为 50 次嵌套调用,然后将强制终止应用程序。下面演示一下,在启用 Xdebug 的状态下运行下列代码:

    清单 2. 限制递归
    <?php
        function deep_end( ) {
            deep_end();
        }
        
        deep_end();
    ?>

    函数 deep_end() 将逐行进行到最底部。Xdebug 将在 49 次函数调用后介入并得到图 2(顺便说一句,main() 的初始调用用于启动程序计数作为第 1 次调用)。

    图 2. 如果调用堆栈超出限制,Xdebug 将终止执行(如果想要显示如下信息,需要配置php.ini中的error_reporting和display_errors参数
    递归次数过多

    如果应用程序大量使用递归隔离并解决较大的问题,则需要把深度相应地设定得 “更低”。否则,将 xdebug.max_nesting_level 设为较小的值,这样可以更快速地捕捉失控的函数调用序列。

    回答四个 w 问题

    出错时,您需要回答四个 w 问题。Xdebug 可以立即提供所有这些信息。下面是一些有益的初始设置;您可以随时调整这些设置。

    清单 3. 错误
    xdebug.dump_once = On
    xdebug.dump_globals = On
    xdebug.dump_undefined = On
    xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
    xdebug.dump.REQUEST=*
    
    xdebug.show_exception_trace = On
    xdebug.show_local_vars = 1
    xdebug.var_display_max_depth = 6

    xdebug.dump_oncexdebug.dump_globalsxdebug.dump_undefined 和 xdebug.dump_SUPERGLOBAL 设置(其中 SUPERGLOBAL 可以是COOKIEFILESGETPOSTREQUESTSERVER 或 SESSION)用于控制哪些 PHP 超全局变量将被包含在所有诊断结果中。

    将 xdebug.dump_globals 设为 On 以转储名为 xdebug.dump_SUPERGLOBAL 设置中的超全局变量。例如,xdebug.dump_SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT 将打印 PHP 超全局变量 $_SERVER['REQUEST_METHOD']$_SERVER['REQUEST_URI'] 和$_SERVER['HTTP_USER_AGENT']。如果需要打印超全局变量数组中的所有值,请使用星号 (*),例如 xdebug.dump_REQUEST=*。如果进一步将xdebug.dump_undefined 设为 On 并且不设定指定的超全局变量,则仍用值 undefined 打印变量。

    即使捕捉到异常,代码行 xdebug.show_exception_trace = On 仍将强制执行异常跟踪。代码行 xdebug.show_local_vars = 1 将打印每个函数调用的最外围中的所有局部变量,包括尚未初始化的变量。而 xdebug.var_display_max_depth = 6 表示转储复杂变量的深度。

    整合

    清单 4 显示了 php.ini 文件的 Xdebug 的所有相关设置。

    清单 4. php.ini 文件的设置
    zend_extension = /usr/lib/php4/20020429/xdebug.so
    xdebug.default_enable = On
    xdebug.show_exception_trace = On
    xdebug.show_local_vars = 1
    xdebug.max_nesting_level = 50
    xdebug.var_display_max_depth = 6
    
    xdebug.dump_once = On
    xdebug.dump_globals = On
    xdebug.dump_undefined = On
    xdebug.dump.REQUEST = *
    xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT

    将这些设置(或类似的内容)保存到 php.ini 文件中,然后重新启动 Web 服务器。

    解释转储报告

    以下示例显示了出错时发生的情况。把您的 “有待改进” 的代码修改为类似清单 5 所示的代码。

    清单 5. 修改错误代码
    <?php
        function deep_end( $count ) {
            // add one to the frame count
            $count += 1;
    
            if ( $count < 48 ) {
                    deep_end( $count );
            }
            else {
                    trigger_error( "going off the deep end!" );
            }
        }
    
        // main() is called to start the program, 
        // so the call stack begins with one frame
        deep_end( 1 );
    ?>

    如果运行这段新代码,您应当会看到大量信息,如下所示:

    图 3. 出错时超全局变量、堆栈和局部变量的转储
    出错时超全局变量、堆栈和局部变量的转储

    传递给 trigger_error 的消息文本显示在顶部。底部是受请求的 $_SERVER 元素列表和已经定义的 $_REQUEST 元素列表。最底部是 #48 范围中的变量列表,这是根据清单对 deep_end() 进行的调用。在调用中,$count 是整数 48。当此 Xdebug 配置就绪后,您现在有更多的线索可以跟踪犯罪者。

    下面是另外一个技巧:Xdebug 提供了一个增强型 var_dump() 函数,它对于 PHP 数组和类尤为有帮助。例如,清单 6 显示了简单的(PHP V4)类和实例。

    清单 6. PHP V4 类和实例
    <?php
        class Person {
            var $name;
            var $surname;
            var $age;
            var $children = array();
    
            function Person( $name, $surname, $age, $children = null) {
                $this->name = $name;
                $this->surname = $surname;
                $this->age = $age;
                foreach ( $children as $child ) {
                    $this->children[] = $child;
                }
            }
        }   
    
        $boy = new Person( 'Joe', 'Smith', 4 );
        $girl = new Person( 'Jane', 'Smith', 6 );
        $mom = new Person( 'Mary', 'Smith', 34, array( $boy, $girl ) );
    
        var_dump( $boy, $mom );
    ?>

    清单 7 显示了 var_dump() 的输出。

    清单 7. var_dump() 输出
    object(person)
      var 'name' => string 'Joe' (length=3)
      var 'surname' => string 'Smith' (length=5)
      var 'age' => int 4
      var 'children' => 
        array
          empty
          
    object(person)
      var 'name' => string 'Mary' (length=4)
      var 'surname' => string 'Smith' (length=5)
      var 'age' => int 34
      var 'children' => 
        array
          0 => 
            object(person)
              var 'name' => string 'Joe' (length=3)
              var 'surname' => string 'Smith' (length=5)
              var 'age' => int 4
              var 'children' => 
                array
                  empty
          1 => 
            object(person)
              var 'name' => string 'Jane' (length=4)
              var 'surname' => string 'Smith' (length=5)
              var 'age' => int 6
              var 'children' => 
                array
                  empty

    如果结合使用 Xdebug 与 PHP V5 类,转储包括 publicprivate 和 protected 之类的属性。

    跟踪代码

    解决错误 —— 如解开神秘谋杀之谜 —— 通常要求构造详细的时间线。例如,内存泄漏通常不会把自身表明为一个错误计算。相反,操作将正常进行,直至内存用尽,然后应用程序突然终止。如果内存泄漏由于某些请求而恶化,可能会不断出现错误并且难以预测。在内存使用量与时间之间建立映射的时间线将揭示泄漏的严重程度。一条精细的时间线 —— 比如,从函数到函数 —— 将进一步指出泄漏源。

    Xdebug 可以提供一条详细的时间线进行执行跟踪。当跟踪被启用后,Xdebug 将记录所有函数调用,包括每个函数的参数和返回值。您可以将每个日志或跟踪 的格式设为符合人类阅读习惯或者机器可读的格式。您最好使用前者,虽然您可能编写独立而特定的应用程序来分析后者。

    同转储一样,Xdebug 有若干个 php.ini 选项用于自定义跟踪内容。例如,下面一批设置将生成最详细的输出。

    清单 8. 跟踪自定义
    xdebug.trace_format = 0
    xdebug.auto_trace = On
    xdebug.trace_output_dir = /tmp/traces
    xdebug.trace_output_name = trace.%c.%p
    
    xdebug.collect_params = 4
    xdebug.collect_includes = On
    xdebug.collect_return = On
    xdebug.show_mem_delta = On

    设定 xdebug.auto_trace = 1 将在执行所有 PHP 脚本之前先启用自动跟踪。另外,您可以通过代码设定 xdebug.auto_trace = 0,并分别使用 xdebug_start_trace() 和 xdebug_stop_trace() 函数启用和禁用跟踪。但是,如果 xdebug.auto_trace 为 1,则可以在包括配置好的auto_prepend_file 之前先启动跟踪。

    选项 xdebug.trace_ouput_dir 和 xdebug.trace_output_name 用于控制保存跟踪输出的位置。在这里,所有文件都被保存到 /tmp/traces 中,并且每个跟踪文件都以 trace 为开头,后接 PHP 脚本的名称(%s)以及进程 ID(%p)。所有 Xdebug 跟踪文件都以 .xt 后缀结尾。

    默认情况下,Xdebug 将显示时间、内存使用量、函数名和函数调用深度字段。如果将 xdebug.trace_format 设为 0,则输出将符合人类阅读习惯(将参数设为 1 则为机器可读格式)。此外,如果指定 xdebug.show_mem_delta = 1,则可以查看内存使用量是在增加还是在减少,而如果指定 xdebug.collect_params = 4,则可以查看传入参数的类型和值。要监视每个函数返回的值,请设定 xdebug.collect_return = 1

    接下来看另外一个示例。创建 /tmp/traces 目录,然后用 mkdir /tmp/traces; chmod a+rwx /tmp/traces 将其模式更改为能够被任何用户阅读的文件(world-readable)和能够被任何用户写入的文件(world-writable)(如果您不愿共享 traces 目录,请确保至少 Web 服务器用户 —— 通常为 www 或任何人 —— 可以将数据写入该目录)。将以上跟踪设置添加到 php.ini 文件中,重新启动 Web 服务器,然后把浏览器再次指向phpinfo() 应用程序。整个跟踪应当类似清单 9 所示:

    清单 9. 整个跟踪
    TRACE START [2007-06-06 14:04:55]
        0.0003       9440    +9440   -> {main}() /var/www/catalog/t/info.php:0
        0.0005       9440       +0     -> phpinfo() /var/www/catalog/t/info.php:1
                                       >=-> TRUE
                                     >=-> 1
        0.2351       9208
    TRACE END   [2007-06-06 14:04:55]

    在这里,main() 将调用 phpinfo(),后者将返回 TRUE。当 main() 退出时,它将返回 1。接下来,将浏览器指向 “最复杂的内容” 或系统中的其他某个 PHP 应用程序以生成更详细的跟踪。

    清单 10 显示了在计算第四个斐波纳契数列时上一篇文章中的 PHP Fibonacci 生成器的跟踪:

    清单 10. PHP Fibonacci 生成器跟踪
    TRACE START [2007-06-06 14:17:17]
        0.0004      16432   +16432   -> {main}() /var/www/catalog/t/fibonacci.php:0
        0.0006      16696     +264     -> fib('4') /var/www/catalog/t/fibonacci.php:35
        0.0007      16696       +0       -> fib(3) /var/www/catalog/t/fibonacci.php:7
        0.0007      16736      +40         -> fib(2) /var/www/catalog/t/fibonacci.php:7
        0.0007      16848     +112           -> fib(1) /var/www/catalog/t/fibonacci.php:7
                                             >=> 1
        0.0008      16904      +56           -> fib(0) /var/www/catalog/t/fibonacci.php:7
                                             >=> 0
                                           >=> 1
        0.0009      16904       +0         -> fib(1) /var/www/catalog/t/fibonacci.php:7
                                           >=> 1
                                         >=> 2
        0.0009      16904       +0       -> fib(2) /var/www/catalog/t/fibonacci.php:7
        0.0009      16904       +0         -> fib(1) /var/www/catalog/t/fibonacci.php:7
                                           >=> 1
        0.0010      16904       +0         -> fib(0) /var/www/catalog/t/fibonacci.php:7
                                           >=> 0
                                         >=> 1
                                       >=> 3
                                     >=> 1
        0.0011      12528
    TRACE END   [2007-06-06 14:17:17]

    第一列显示时间,第二列是累计的内存使用量,第三列是增加的内存使用量,而第四列显示函数调用,包括参数。

    标有 >=> 的行显示每个函数的返回值(查找相应的缩进 -> 将调用与其返回值匹配起来)。此外,最后的 >=> 1 是 main() 的返回值。

    如果使用 vim,Xdebug 的创造者 Derick Rethans 提供了专门针对 Xdebug 跟踪的一组语法加亮提示。提示包含在 Xdebug 源代码包内的 xt.vim 文件中。对于最近的 Linux 发行版,只需将 xt.vim 复制到 $VIMRUNTIME/syntax/xt.vim 中,然后运行 vim tracefile.xt。图 4 显示了 vim 中加亮的 Fibonacci 跟踪。

    图 4. Xdebug 跟踪的 vim 语法文件将使您可以轻松地进行分析
    vim 中加亮的跟踪

    结束语

    跟踪 PHP 代码中的错误可能是一项挑战。但是如果您有开发系统并且可以安装 Xdebug,那么更正这些错误就会变得轻松得多。Xdebug 可以显示堆栈跟踪,转储甚为复杂的变量,随时间跟踪内存使用量,并允许您在出错或崩溃时(不是如果,而是发生时)进行有效的事后分析。

    This section describes all available configuration settings available in Xdebug(http://www.xdebug.org/docs/all_settings

    Related Settings


    xdebug.auto_trace
    Type:  boolean, Default value:  0
    When this setting is set to on, the tracing of function calls will be enabled just before the script is run. This makes it possible to trace code in the  auto_prepend_file.

    xdebug.cli_color
    Type:  integer, Default value:  0, Introduced in  Xdebug > 2.2

    If this setting is 1, Xdebug will color var_dumps and stack traces output when in CLI mode and when the output is a tty. On Windows, the ANSICON tool needs to be installed.

    If the setting is 2, then Xdebug will always color var_dumps and stack trace, no matter whether it's connected to a tty or whether ANSICON is installed. In this case, you might end up seeing escape codes.

    See this article for some more information.


    xdebug.collect_assignments
    Type:  boolean, Default value:  0, Introduced in  Xdebug > 2.1
    This setting, defaulting to 0, controls whether Xdebug should add variable assignments to function traces.

    xdebug.collect_includes
    Type:  boolean, Default value:  1
    This setting, defaulting to 1, controls whether Xdebug should write the filename used in include(), include_once(), require() or require_once() to the trace files.

    xdebug.collect_params
    Type:  integer, Default value:  0

    This setting, defaulting to 0, controls whether Xdebug should collect the parameters passed to functions when a function call is recorded in either the function trace or the stack trace.

    The setting defaults to 0 because for very large scripts it may use huge amounts of memory and therefore make it impossible for the huge script to run. You can most safely turn this setting on, but you can expect some problems in scripts with a lot of function calls and/or huge data structures as parameters. Xdebug 2 will not have this problem with increased memory usage, as it will never store this information in memory. Instead it will only be written to disk. This means that you need to have a look at the disk usage though.

    This setting can have four different values. For each of the values a different amount of information is shown. Below you will see what information each of the values provides. See also the introduction of the feature Stack Traces for a few screenshots.

    ValueArgument Information Shown
    0 None.
    1 Type and number of elements (f.e. string(6), array(8)).
    2

    Type and number of elements, with a tool tip for the full information 1.

    3 Full variable contents (with the limits respected as set by xdebug.var_display_max_children,xdebug.var_display_max_data and xdebug.var_display_max_depth.
    4 Full variable contents and variable name.
    5 PHP serialized variable contents, without the name. (New in Xdebug 2.3)

    1 in the CLI version of PHP it will not have the tool tip, nor in output files.


    xdebug.collect_return
    Type:  boolean, Default value:  0

    This setting, defaulting to 0, controls whether Xdebug should write the return value of function calls to the trace files.

    For computerized trace files (xdebug.trace_format=1) this only works from Xdebug 2.3 onwards.


    xdebug.collect_vars
    Type:  boolean, Default value:  0
    This setting tells Xdebug to gather information about which variables are used in a certain scope. This analysis can be quite slow as Xdebug has to reverse engineer PHP's opcode arrays. This setting will not record which values the different variables have, for that use  xdebug.collect_params. This setting needs to be enabled only if you wish to use xdebug_get_declared_vars().

    xdebug.coverage_enable
    Type:  boolean, Default value:  1, Introduced in  Xdebug >= 2.2
    If this setting is set to 0, then Xdebug will not set-up internal structures to allow code coverage. This speeds up Xdebug quite a bit, but of course,  Code Coverage Analysis won't work.

    xdebug.default_enable
    Type:  boolean, Default value:  1
    If this setting is 1, then stacktraces will be shown by default on an error event. You can disable showing stacktraces from your code with  xdebug_disable(). As this is one of the basic functions of Xdebug, it is advisable to leave this setting set to 1.

    xdebug.dump.*
    Type:  string, Default value:  Empty

    * can be any of COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION. These seven settings control which data from the superglobals is shown when an error situation occurs.

    Each of those php.ini setting can consist of a comma seperated list of variables from this superglobal to dump, or * for all of them. Make sure you do not add spaces in this setting.

    In order to dump the REMOTE_ADDR and the REQUEST_METHOD when an error occurs, and all GET parameters, add these settings:

    xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHOD
    xdebug.dump.GET = *
    

    xdebug.dump_globals
    Type:  boolean, Default value:  1
    Controls whether the values of the superglobals as defined by the  xdebug.dump.* settings should be shown or not.

    xdebug.dump_once
    Type:  boolean, Default value:  1
    Controls whether the values of the superglobals should be dumped on all error situations (set to 0) or only on the first (set to 1).

    xdebug.dump_undefined
    Type:  boolean, Default value:  0
    If you want to dump undefined values from the superglobals you should set this setting to 1, otherwise leave it set to 0.

    xdebug.extended_info
    Type:  integer, Default value:  1
    Controls whether Xdebug should enforce 'extended_info' mode for the PHP parser; this allows Xdebug to do file/line breakpoints with the remote debugger. When tracing or profiling scripts you generally want to turn off this option as PHP's generated oparrays will increase with about a third of the size slowing down your scripts. This setting can not be set in your scripts with ini_set(), but only in php.ini.

    xdebug.file_link_format
    Type:  string, Default value:  , Introduced in  Xdebug > 2.1

    This setting determines the format of the links that are made in the display of stack traces where file names are used. This allows IDEs to set up a link-protocol that makes it possible to go directly to a line and file by clicking on the filenames that Xdebug shows in stack traces. An example format might look like:

    myide://%f@%l
    

    The possible format specifiers are:

    SpecifierMeaning
    %f the filename
    %l the line number

    For various IDEs/OSses there are some instructions listed on how to make this work:

    Firefox on Linux

    • Open about:config
    • Add a new boolean setting "network.protocol-handler.expose.xdebug"
    • Add the following into a shell script ~/bin/ff-xdebug.sh:
      #! /bin/sh
      
      f=`echo $1 | cut -d @ -f 1 | sed 's/xdebug:\/\///'`
      l=`echo $1 | cut -d @ -f 2`
      
      Add to that one of (depending whether you have komodo or gvim):
      • komodo $f -l $l
      • gvim --remote-tab +$l $f
    • Make the script executable with chmod +x ~/bin/ff-xdebug.sh
    • Set the xdebug.file_link_format setting to xdebug://%f@%l

    Windows and netbeans

    • Create the file netbeans.bat and save it in your path (C:\Windows will work):
      @echo off
      setlocal enableextensions enabledelayedexpansion
      set NETBEANS=%1
      set FILE=%~2
      %NETBEANS% --nosplash --console suppress --open "%FILE:~19%"
      nircmd win activate process netbeans.exe
      

      Note: Remove the last line if you don't have nircmd.

    • Save the following code as netbeans_protocol.reg:
      Windows Registry Editor Version 5.00
      
      [HKEY_CLASSES_ROOT\netbeans]
      "URL Protocol"=""
      @="URL:Netbeans Protocol"
      
      [HKEY_CLASSES_ROOT\netbeans\DefaultIcon]
      @="\"C:\\Program Files\\NetBeans 7.1.1\\bin\\netbeans.exe,1\""
      
      [HKEY_CLASSES_ROOT\netbeans\shell]
      
      [HKEY_CLASSES_ROOT\netbeans\shell\open]
      
      [HKEY_CLASSES_ROOT\netbeans\shell\open\command]
      @="\"C:\\Windows\\netbeans.bat\" \"C:\\Program Files\\NetBeans 7.1.1\\bin\\netbeans.exe\" \"%1\""
      

      Note: Make sure to change the path to Netbeans (twice), as well as the netbeans.bat batch file if you saved it somewhere else than C:\Windows\.

    • Double click on the netbeans_protocol.reg file to import it into the registry.
    • Set the xdebug.file_link_format setting to xdebug.file_link_format = "netbeans://open/?f=%f:%l"

    xdebug.force_display_errors
    Type:  int, Default value:  0, Introduced in  Xdebug 2.3

    If this setting is set to 1 then errors will always be displayed, no matter what the setting of PHP's display_errors is.


    xdebug.force_error_reporting
    Type:  int, Default value:  0, Introduced in  Xdebug 2.3

    This setting is a bitmask, like error_reporting. This bitmask will be logically ORed with the bitmask represented byerror_reporting to dermine which errors should be displayed. This setting can only be made in php.ini and allows you to force certain errors from being shown no matter what an application does with ini_set().


    xdebug.halt_level
    Type:  int, Default value:  0, Introduced in  Xdebug 2.3

    This setting allows you to configure a mask that determines whether, and which, notices and/or warnings get converted to errors. You can configure notices and warnings that are generated by PHP, and notices and warnings that you generate yourself (by means of trigger_error()). For example, to convert the warning of strlen() (without arguments) to an error, you would do:

    ini_set('xdebug.halt_level', E_WARNING);
    echo "Hi!\n";
    

    Which will then result in the showing of the error message, and the abortion of the script. echo "Hi!\n"; will not be executed.

    The setting is a bit mask, so to convert all notices and warnings into errors for all applications, you can set this in php.ini:

    xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE
    

    The bitmask only supports the four level that are mentioned above.


    xdebug.idekey
    Type:  string, Default value:  *complex*
    Controls which IDE Key Xdebug should pass on to the DBGp debugger handler. The default is based on environment settings. First the environment setting DBGP_IDEKEY is consulted, then USER and as last USERNAME. The default is set to the first environment variable that is found. If none could be found the setting has as default ''. If this setting is set, it always overrides the environment variables.

    xdebug.manual_url
    Type:  string, Default value:  http://www.php.net, Introduced in  Xdebug < 2.2.1
    This is the base url for the links from the function traces and error message to the manual pages of the function from the message. It is advisable to set this setting to use the closest mirror.

    xdebug.max_nesting_level
    Type:  integer, Default value:  100
    Controls the protection mechanism for infinite recursion protection. The value of this setting is the maximum level of nested functions that are allowed before the script will be aborted.

    xdebug.overload_var_dump
    Type:  boolean, Default value:  1, Introduced in  Xdebug > 2.1

    By default Xdebug overloads var_dump() with its own improved version for displaying variables when the html_errors php.ini setting is set to 1. In case you do not want that, you can set this setting to 0, but check first if it's not smarter to turn off html_errors.

    You can also use 2 as value for this setting. Besides formatting the var_dump() output nicely, it will also add filename and line number to the output. The xdebug.file_link_format setting is also respected. (New in Xdebug 2.3)


    xdebug.profiler_append
    Type:  integer, Default value:  0
    When this setting is set to 1, profiler files will not be overwritten when a new request would map to the same file (depnding on the  xdebug.profiler_output_name setting. Instead the file will be appended to with the new profile.

    xdebug.profiler_enable
    Type:  integer, Default value:  0
    Enables Xdebug's profiler which creates files in the  profile output directory. Those files can be read by KCacheGrind to visualize your data. This setting can not be set in your script with ini_set(). If you want to selectively enable the profiler, please set  xdebug.profiler_enable_trigger to 1  instead of using this setting.

    xdebug.profiler_enable_trigger
    Type:  integer, Default value:  0
    When this setting is set to 1, you can trigger the generation of profiler files by using the XDEBUG_PROFILE GET/POST parameter, or set a cookie with the name XDEBUG_PROFILE. This will then write the profiler data to  defined directory. In order to prevent the profiler to generate profile files for each request, you need to set  xdebug.profiler_enable to 0.

    xdebug.profiler_output_dir
    Type:  string, Default value:  /tmp
    The directory where the profiler output will be written to, make sure that the user who the PHP will be running as has write permissions to that directory. This setting can not be set in your script with ini_set().

    xdebug.profiler_output_name
    Type:  string, Default value:  cachegrind.out.%p

    This setting determines the name of the file that is used to dump traces into. The setting specifies the format with format specifiers, very similar to sprintf() and strftime(). There are several format specifiers that can be used to format the file name.

    See the xdebug.trace_output_name documentation for the supported specifiers.


    xdebug.remote_autostart
    Type:  boolean, Default value:  0
    Normally you need to use a specific HTTP GET/POST variable to start remote debugging (see  Remote Debugging). When this setting is set to 1, Xdebug will always attempt to start a remote debugging session and try to connect to a client, even if the GET/POST/COOKIE variable was not present.

    xdebug.remote_connect_back
    Type:  boolean, Default value:  0, Introduced in  Xdebug > 2.1
    If enabled, the  xdebug.remote_host setting is ignored and Xdebug will try to connect to the client that made the HTTP request. It checks the $_SERVER['REMOTE_ADDR'] variable to find out which IP address to use. Please note that there is  nofilter available, and anybody who can connect to the webserver will then be able to start a debugging session, even if their address does not match  xdebug.remote_host.

    xdebug.remote_cookie_expire_time
    Type:  integer, Default value:  3600, Introduced in  Xdebug > 2.1
    This setting can be used to increase (or decrease) the time that the remote debugging session stays alive via the session cookie.

    xdebug.remote_enable
    Type:  boolean, Default value:  0
    This switch controls whether Xdebug should try to contact a debug client which is listening on the host and port as set with the settings  xdebug.remote_host and  xdebug.remote_port. If a connection can not be established the script will just continue as if this setting was 0.

    xdebug.remote_handler
    Type:  string, Default value:  dbgp

    Can be either 'php3' which selects the old PHP 3 style debugger output, 'gdb' which enables the GDB like debugger interface or 'dbgp' - the debugger protocol. The DBGp protocol is the only supported protocol.

    Note: Xdebug 2.1 and later only support 'dbgp' as protocol.


    xdebug.remote_host
    Type:  string, Default value:  localhost
    Selects the host where the debug client is running, you can either use a host name or an IP address. This setting is ignored if  xdebug.remote_connect_back is enabled.

    xdebug.remote_log
    Type:  string, Default value:
    If set to a value, it is used as filename to a file to which all remote debugger communications are logged. The file is always opened in append-mode, and will therefore not be overwritten by default. There is no concurrency protection available. The format of the file looks something like:
    Log opened at 2007-05-27 14:28:15
    -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/x ... ight></init>
    
    <- step_into -i 1
    -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/db ... ></response>
    

    xdebug.remote_mode
    Type:  string, Default value:  req

    Selects when a debug connection is initiated. This setting can have two different values:

    req
    Xdebug will try to connect to the debug client as soon as the script starts.
    jit
    Xdebug will only try to connect to the debug client as soon as an error condition occurs.

    xdebug.remote_port
    Type:  integer, Default value:  9000
    The port to which Xdebug tries to connect on the remote host. Port 9000 is the default for both the client and the bundled debugclient. As many clients use this port number, it is best to leave this setting unchanged.

    xdebug.scream
    Type:  boolean, Default value:  0, Introduced in  Xdebug >= 2.1
    If this setting is 1, then Xdebug will disable the @ (shut-up) operator so that notices, warnings and errors are no longer hidden.

    xdebug.show_exception_trace
    Type:  integer, Default value:  0
    When this setting is set to 1, Xdebug will show a stack trace whenever an exception is raised - even if this exception is actually caught.

    xdebug.show_local_vars
    Type:  integer, Default value:  0
    When this setting is set to something != 0 Xdebug's generated stack dumps in error situations will also show all variables in the top-most scope. Beware that this might generate a lot of information, and is therefore turned off by default.

    xdebug.show_mem_delta
    Type:  integer, Default value:  0
    When this setting is set to something != 0 Xdebug's human-readable generated trace files will show the difference in memory usage between function calls. If Xdebug is configured to generate computer-readable trace files then they will always show this information.

    xdebug.trace_enable_trigger
    Type:  boolean, Default value:  0, Introduced in  Xdebug > 2.2
    When this setting is set to 1, you can trigger the generation of trace files by using the XDEBUG_TRACE GET/POST parameter, or set a cookie with the name XDEBUG_TRACE. This will then write the trace data to  defined directory. In order to prevent Xdebug to generate trace files for each request, you need to set  xdebug.auto_trace to 0.

    xdebug.trace_format
    Type:  integer, Default value:  0

    The format of the trace file.

    ValueDescription
    0 shows a human readable indented trace file with: time index, memory usage, memory delta (if the settingxdebug.show_mem_delta is enabled), level, function name, function parameters (if the setting xdebug.collect_paramsis enabled), filename and line number.
    1 writes a computer readable format which has two different records. There are different records for entering a stack frame, and leaving a stack frame. The table below lists the fields in each type of record. Fields are tab separated.
    2 writes a trace formatted in (simple) HTML.

    Fields for the computerized format:

    Record type 1 2 3 4 5 6 7 8 9 10 11 12 - ...
    Entry level function # always '0' time index memory usage function name user-defined (1) or internal function (0) name of the include/require file filename line number no. of parameters parameters (as many as specified in field 11) - tab separated
    Exit level function # always '1' time index memory usage empty
    Return level function # always 'R' empty return value empty

    See the introduction of Function Traces for a few examples.


    xdebug.trace_options
    Type:  integer, Default value:  0
    When set to '1' the trace files will be appended to, instead of being overwritten in subsequent requests.

    xdebug.trace_output_dir
    Type:  string, Default value:  /tmp
    The directory where the tracing files will be written to, make sure that the user who the PHP will be running as has write permissions to that directory.

    xdebug.trace_output_name
    Type:  string, Default value:  trace.%c

    This setting determines the name of the file that is used to dump traces into. The setting specifies the format with format specifiers, very similar to sprintf() and strftime(). There are several format specifiers that can be used to format the file name. The '.xt' extension is always added automatically.

    The possible format specifiers are:

    SpecifierMeaningExample FormatExample Filename
    %c crc32 of the current working directory trace.%c trace.1258863198.xt
    %p pid trace.%p trace.5174.xt
    %r random number trace.%r trace.072db0.xt
    %s

    script name 2

    cachegrind.out.%s cachegrind.out._home_httpd_html_test_xdebug_test_php
    %t timestamp (seconds) trace.%t trace.1179434742.xt
    %u timestamp (microseconds) trace.%u trace.1179434749_642382.xt
    %H $_SERVER['HTTP_HOST'] trace.%H trace.kossu.xt
    %R $_SERVER['REQUEST_URI'] trace.%R trace._test_xdebug_test_php_var=1_var2=2.xt
    %U $_SERVER['UNIQUE_ID'] 3 trace.%U trace.TRX4n38AAAEAAB9gBFkAAAAB.xt
    %S session_id (from $_COOKIE if set) trace.%S trace.c70c1ec2375af58f74b390bbdd2a679d.xt
    %% literal % trace.%% trace.%%.xt

    2 This one is not available for trace file names.

    3 New in version 2.2. This one is set by Apache's mod_unique_id module


    xdebug.var_display_max_children
    Type:  integer, Default value:  128

    Controls the amount of array children and object's properties are shown when variables are displayed with eitherxdebug_var_dump()xdebug.show_local_vars or through Function Traces.

    To disable any limitation, use -1 as value.

    This setting does not have any influence on the number of children that is send to the client through the Remote Debuggingfeature.


    xdebug.var_display_max_data
    Type:  integer, Default value:  512

    Controls the maximum string length that is shown when variables are displayed with either xdebug_var_dump(),xdebug.show_local_vars or through Function Traces.

    To disable any limitation, use -1 as value.

    This setting does not have any influence on the number of children that is send to the client through the Remote Debuggingfeature.


    xdebug.var_display_max_depth
    Type:  integer, Default value:  3

    Controls how many nested levels of array elements and object properties are when variables are displayed with eitherxdebug_var_dump()xdebug.show_local_vars or through Function Traces.

    The maximum value you can select is 1023. You can also use -1 as value to select this maximum number.

    This setting does not have any influence on the number of children that is send to the client through the Remote Debuggingfeature.


    转自:http://www.ibm.com/developerworks/cn/opensource/os-php-xdebug/index.html#resources


    展开全文
  • 主编, McClatchy Interactive2007 年 9 月 17 日PHP 的 Xdebug 扩展可以帮助您在程序出错或

     

    来源:http://www.ibm.com/developerworks/cn/opensource/os-php-xdebug/index.html

     

    Martin Streicher (martin.streicher@gmail.com), 主编, McClatchy Interactive

    2007 年 9 月 17 日

    PHP 的 Xdebug 扩展可以帮助您在程序出错或失败时剖析应用程序以查找原因。通过本文了解如何使用 Xdebug 跟踪调用堆栈、分析内存使用情况并查看参数和变量的内容。

    虽然您可以使用 PHP 为系统管理和传统数据处理之类的任务创建命令行脚本,但是编程语言对 Web 应用程序的性能有主要影响。在使用过程中,每个 PHP 应用程序都驻留在服务器上,并且将通过代理(例如 Apache)调用 PHP 应用程序处理到来的请求。对于每个请求,典型的 PHP Web 应用程序在简短运行后将得到一个 Web 页面或 XML 数据结构。

    假定经过简单的运行后,一个分层构造的 Web 应用程序 —— 包括客户机、网络、HTTP 服务器、应用程序代码和底层数据库 —— 将会很难隔离 PHP 代码中的错误。即使假定除了 PHP 代码以外所有层都可以正常运行,跟踪 PHP 代码中的错误也会非常难,尤其是在应用程序利用较多的类时更是如此。

    PHP 语句 echo 和函数 var_dump()debug_zval_dump()print_r() 都是常见且流行的调试辅助工具,可以帮助解决多种问题。但是,这些语句 —— 甚至更健壮的工具,例如 PEAR Log package —— 都是取证工具,必须在上下文环境之外先进行推测分析才能生成证据。

    在某种程度上,通过推论进行调试是一种蛮干的做法。收集并筛选数据,尝试推论出发生的问题。如果缺少重要信息,则必须重新测试代码、重复执行步骤,然后重新开始研究。一种更加高效的方法是 程序运行时探测应用程序。您可以对请求参数分类,筛选过程调用堆栈,并查询任何所需的变量或对象。您可以暂时中断应用程序并且可以在变量更改值时收到警报。在某些情况下,您可以通过交互式询问 “如果……会怎样?” 问题来实际影响变量。

    称为调试器 的特殊应用程序支持这种 “实时的” 或交互式的检查。调试器可能启动并连接到进程上以便控制进程并监测其内存。或者,在使用解释语言的情况下,调试器可以直接解释代码。典型的现代图形化调试器可以索引并浏览代码,以符合人类阅读习惯的形式轻松地显示复杂的数据结构,并同时显示程序状态,如调用堆栈、中间输出和所有变量的值。例如,调试器通常都会把类的属性和方法分类并进行描述。

    在本文和下一篇文章中,我将介绍的工具一定能够简化 PHP 调试。下一次,我将主要介绍交互式调试和 Zend Debugger —— 一个特别针对 PHP 的健壮调试器 —— 并探究它提供的许多功能。(Zend Debugger 是一款商业产品,是 Zend PHP 集成开发环境(IDE)的一部分)。我还将介绍一款开源 PHP 调试器,以免您只愿把钱花在啤酒上,而不是花在代码上。但是,本文将主要介绍如何更好地取证。

    类似《犯罪现场调查》,只是更令人讨厌

    代码出错、未能生成某个所需结果或者彻底崩溃时,您需要回答四个 w 问题:where、what、why 和 when:

    • “where” 是应用程序最后一次正常运行时所在的文件和行号。
    • “what” 是犯错的代码 —— 比如说,嫌疑犯。
    • “why” 是错误的本质。可能它是一个逻辑错误和/或与操作系统进行交互所导致的错误,或两者兼具。
    • 而 “when” 是出现错误时的上下文。在程序终止前发生了什么情况?像在所有犯罪行为中一样,如果您可以收集到足够的线索,那么线索就可以帮助您找到犯人。

     

    一种取证工具 Xdebug(上一篇文章中使用的工具,用于分析 PHP 应用程序性能),如名称所示,将提供几个说明程序状态的功能,并且是应当添加到指令系统中的价值颇高的研究工具(请参阅 参考资料)。安装后,Xdebug 将阻止无限次递归(表面上是这样)、修正关于堆栈跟踪和函数跟踪的错误消息以及监视内存分配,并提供其他功能。Xdebug 还包括一组函数,您可以将这组函数添加到代码中以进行运行时错误诊断。

    例如,下面的代码将使用一些 xdebug_...() 步骤测试 callee() 函数,以便输出调用程序的具体位置,包括文件名、行号和调用函数的名称。


    清单 1. 测试 callee() 函数的步骤
                    
    <?php
        function callee( $a ) {
            echo sprintf("callee() called @ %s: %s from %s",
                xdebug_call_file(),
                xdebug_call_line(),
                xdebug_call_function()
            );
        }
    
        $result = callee( "arg" );
    ?>
    

    这段代码将生成:

    callee() called @ /var/www/catalog/xd.php: 10 from {main}
    





    回页首


    构建和安装 Xdebug

    Xdebug 可以很轻松地从 UNIX® 类操作系统(包括 Mac OS X)中的源代码构建。如果是在 Microsoft® Windows® 上使用 PHP,则可以从 Xdebug Web 站点下载最新 PHP 版本的二进制 Xdebug 模块(请参阅 参考资料)。

    让我们来构建和安装适用于 Debian “Sarge” Linux® 和 PHP V4.3.10-19 的 Xdebug。在撰写本文时,Xdebug 的最新版本是 V2.0.0RC4,发布于 2007 年 5 月 17 日。要继续本文,必须拥有 phpize 和 php-config 实用程序,并且必须能够编辑系统的 php.ini 配置文件(如果没有实用程序,请访问 PHP.net 以获得如何从头构建 PHP 的源代码和说明)。请执行以下步骤:

    1. 下载 Xdebug tarball(一个用 gzip 压缩的 .tar 归档文件)。wget 命令可以帮助您轻松地完成此操作:
       $ 
      wget http://www.xdebug.org/files/xdebug-2.0.0RC4.tgz
                          

    2. 解压缩该 tarball 并切换到源代码目录:
      $ tar xzf xdebug-2.0.0RC4.tgz
      $ cd xdebug-2.0.0RC4
                          

    3. 运行 phpize 以准备适用于您的 PHP 版本的 Xdebug 代码:
      $ phpize
      Configuring for:
      PHP Api Version:         20020918
      Zend Module Api No:      20020429
      Zend Extension Api No:   20021010
      

      phpize 的输出是一个脚本 —— 通常名为配置 —— 用于调整其余的构建过程。
    4. 运行配置脚本:
      $ ./configure
      checking build system type... i686-pc-linux-gnu
      checking host system type... i686-pc-linux-gnu
      checking for gcc... gcc
      checking for C compiler default output file name... a.out
      checking whether the C compiler works... yes
      checking whether we are cross compiling... no
      checking for suffix of executables... 
      checking for suffix of object files... o
      ...
      checking whether stripping libraries is possible... yes
      appending configuration tag "F77" to libtool
      configure: creating ./config.status
      config.status: creating config.h
      

    5. 通过运行 make 构建 Xdebug 扩展:
      $ make
      /bin/sh /home/strike/tmp/xdebug-2.0.0RC4/libtool
      --mode=compile gcc  -I.
      -I/home/strike/tmp/xdebug-2.0.0RC4 -DPHP_ATOM_INC
      -I/home/strike/tmp/xdebug-2.0.0RC4/include
      -I/home/strike/tmp/xdebug-2.0.0RC4/main
      -I/home/strike/tmp/xdebug-2.0.0RC4
      -I/usr/include/php4 -I/usr/include/php4/main
      -I/usr/include/php4/Zend -I/usr/include/php4/TSRM 
      -DHAVE_CONFIG_H  -g -O0 -c
      /home/strike/tmp/xdebug-2.0.0RC4/xdebug.c -o
      xdebug.lo mkdir .libs
      ...
      
      Build complete.
      (It is safe to ignore warnings about tempnam and tmpnam).
      

      使用 make 将生成 Xdebug 扩展 xdebug.so。
    6. 安装该扩展:
      $ sudo make install
      Installing shared extensions:     /usr/lib/php4/20020429/
      

      继续之前,使用鼠标选择并复制上一条命令显示的目录。该路径对于最后一步配置扩展至关重要。
    7. 在您喜欢的文本编辑器中打开 php.ini 文件,然后添加以下代码:
      zend_extension = /usr/lib/php4/20020429/xdebug.so
      xdebug.profiler_enable = Off
      xdebug.default_enable = On
      

      第一行将装入 Xdebug 扩展;第二行将禁用 Xdebug 的分析器功能(只是为了简单起见),而第三行将启用扩展的调试功能。

    要检验 Xdebug 扩展是否已经安装并启用,请重新启动 Web 服务器,然后用代码 <?php phpinfo(); ?> 创建简单的一行 PHP 应用程序。如果将浏览器指向文件 —— 如 http://localhost/phpinfo.php —— 并向下滚动,您应当会看到类似图 1 所示的内容。


    图 1. 检验 Xdebug 扩展是否已经安装并运行
    Xdebug 扩展已启用

    注:如果您在 phpinfo() 的输出中没有看到 Xdebug 部分,则 Xdebug 装入失败。Apache 错误日志会列出原因。常见错误包括 zend_extension 的路径错误或者与其他扩展发生冲突。例如,如果需要使用 XCache 和 Xdebug,一定要先装入 XCache。但是,由于 Xdebug 适于在开发时使用并假定 xdebug.so 的路径正确,因此需要禁用其他扩展并重试。然后您可以重新启用扩展以执行其他测试,如缓存的效果。Xdebug 站点还有其他一些故障检修技巧。





    回页首


    配置 Xdebug

    指令(图 1 中大表的最左侧一列)是一些可以设定的参数,用于改变 Xdebug 扩展的行为。可在 php.ini 文件中设置所有指令。一些指令用于配置调试工具;其他指令用于调整分析器的操作。忽略后者,让我们用一些合理设置来配置 Xdebug 以帮助调试 PHP 代码。

    限制递归

    如果应用程序使用递归 —— 例如,计算斐波纳契数列 —— 并且终端环境不正确,应用程序会运行很长一段时间后才用尽内存或超时。您可以设定 xdebug.max_nesting_level 参数来限定递归深度。例如,xdebug.max_nesting_level = 50 将把递归深度限定为 50 次嵌套调用,然后将强制终止应用程序。下面演示一下,在启用 Xdebug 的状态下运行下列代码:


    清单 2. 限制递归
                    
    <?php
        function deep_end( ) {
            deep_end();
        }
        
        deep_end();
    ?>
    

    函数 deep_end() 将逐行进行到最底部。Xdebug 将在 49 次函数调用后介入并得到图 2(顺便说一句,main() 的初始调用用于启动程序计数作为第 1 次调用)。


    图 2. 如果调用堆栈超出限制,Xdebug 将终止执行
    递归次数过多

    如果应用程序大量使用递归隔离并解决较大的问题,则需要把深度相应地设定得 “更低”。否则,将 xdebug.max_nesting_level 设为较小的值,这样可以更快速地捕捉失控的函数调用序列。

    回答四个 w 问题

    出错时,您需要回答四个 w 问题。Xdebug 可以立即提供所有这些信息。下面是一些有益的初始设置;您可以随时调整这些设置。


    清单 3. 错误
                    
    xdebug.dump_once = On
    xdebug.dump_globals = On
    xdebug.dump_undefined = On
    xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
    xdebug.dump.REQUEST=*
    
    xdebug.show_exception_trace = On
    xdebug.show_local_vars = 1
    xdebug.var_display_max_depth = 6
    

    xdebug.dump_oncexdebug.dump_globalsxdebug.dump_undefinedxdebug.dump_SUPERGLOBAL 设置(其中 SUPERGLOBAL 可以是 COOKIEFILESGETPOSTREQUESTSERVERSESSION)用于控制哪些 PHP 超全局变量将被包含在所有诊断结果中。

    xdebug.dump_globals 设为 On 以转储名为 xdebug.dump_SUPERGLOBAL 设置中的超全局变量。例如,xdebug.dump_SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT 将打印 PHP 超全局变量 $_SERVER['REQUEST_METHOD']$_SERVER['REQUEST_URI']$_SERVER['HTTP_USER_AGENT']。如果需要打印超全局变量数组中的所有值,请使用星号 (*),例如 xdebug.dump_REQUEST=*。如果进一步将 xdebug.dump_undefined 设为 On 并且不设定指定的超全局变量,则仍用值 undefined 打印变量。

    即使捕捉到异常,代码行 xdebug.show_exception_trace = On 仍将强制执行异常跟踪。代码行 xdebug.show_local_vars = 1 将打印每个函数调用的最外围中的所有局部变量,包括尚未初始化的变量。而 xdebug.var_display_max_depth = 6 表示转储复杂变量的深度。

    整合

    清单 4 显示了 php.ini 文件的 Xdebug 的所有相关设置。


    清单 4. php.ini 文件的设置
                    
    zend_extension = /usr/lib/php4/20020429/xdebug.so
    xdebug.default_enable = On
    xdebug.show_exception_trace = On
    xdebug.show_local_vars = 1
    xdebug.max_nesting_level = 50
    xdebug.var_display_max_depth = 6
    
    xdebug.dump_once = On
    xdebug.dump_globals = On
    xdebug.dump_undefined = On
    xdebug.dump.REQUEST = *
    xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
    

    将这些设置(或类似的内容)保存到 php.ini 文件中,然后重新启动 Web 服务器。





    回页首


    解释转储报告

    以下示例显示了出错时发生的情况。把您的 “有待改进” 的代码修改为类似清单 5 所示的代码。


    清单 5. 修改错误代码
                    
    <?php
        function deep_end( $count ) {
            // add one to the frame count
            $count += 1;
    
            if ( $count < 48 ) {
                    deep_end( $count );
            }
            else {
                    trigger_error( "going off the deep end!" );
            }
        }
    
        // main() is called to start the program, 
        // so the call stack begins with one frame
        deep_end( 1 );
    ?>
    

    如果运行这段新代码,您应当会看到大量信息,如下所示:


    图 3. 出错时超全局变量、堆栈和局部变量的转储
    出错时超全局变量、堆栈和局部变量的转储

    传递给 trigger_error 的消息文本显示在顶部。底部是受请求的 $_SERVER 元素列表和已经定义的 $_REQUEST 元素列表。最底部是 #48 范围中的变量列表,这是根据清单对 deep_end() 进行的调用。在调用中,$count 是整数 48。当此 Xdebug 配置就绪后,您现在有更多的线索可以跟踪犯罪者。

    下面是另外一个技巧:Xdebug 提供了一个增强型 var_dump() 函数,它对于 PHP 数组和类尤为有帮助。例如,清单 6 显示了简单的(PHP V4)类和实例。


    清单 6. PHP V4 类和实例
                    
    <?php
        class Person {
            var $name;
            var $surname;
            var $age;
            var $children = array();
    
            function Person( $name, $surname, $age, $children = null) {
                $this->name = $name;
                $this->surname = $surname;
                $this->age = $age;
                foreach ( $children as $child ) {
                    $this->children[] = $child;
                }
            }
        }   
    
        $boy = new Person( 'Joe', 'Smith', 4 );
        $girl = new Person( 'Jane', 'Smith', 6 );
        $mom = new Person( 'Mary', 'Smith', 34, array( $boy, $girl ) );
    
        var_dump( $boy, $mom );
    ?>
    

    清单 7 显示了 var_dump() 的输出。


    清单 7. var_dump() 输出
                    
    object(person)
      var 'name' => string 'Joe' (length=3)
      var 'surname' => string 'Smith' (length=5)
      var 'age' => int 4
      var 'children' => 
        array
          empty
          
    object(person)
      var 'name' => string 'Mary' (length=4)
      var 'surname' => string 'Smith' (length=5)
      var 'age' => int 34
      var 'children' => 
        array
          0 => 
            object(person)
              var 'name' => string 'Joe' (length=3)
              var 'surname' => string 'Smith' (length=5)
              var 'age' => int 4
              var 'children' => 
                array
                  empty
          1 => 
            object(person)
              var 'name' => string 'Jane' (length=4)
              var 'surname' => string 'Smith' (length=5)
              var 'age' => int 6
              var 'children' => 
                array
                  empty
    

    如果结合使用 Xdebug 与 PHP V5 类,转储包括 publicprivateprotected 之类的属性。





    回页首


    跟踪代码

    解决错误 —— 如解开神秘谋杀之谜 —— 通常要求构造详细的时间线。例如,内存泄漏通常不会把自身表明为一个错误计算。相反,操作将正常进行,直至内存用尽,然后应用程序突然终止。如果内存泄漏由于某些请求而恶化,可能会不断出现错误并且难以预测。在内存使用量与时间之间建立映射的时间线将揭示泄漏的严重程度。一条精细的时间线 —— 比如,从函数到函数 —— 将进一步指出泄漏源。

    Xdebug 可以提供一条详细的时间线进行执行跟踪。当跟踪被启用后,Xdebug 将记录所有函数调用,包括每个函数的参数和返回值。您可以将每个日志或跟踪 的格式设为符合人类阅读习惯或者机器可读的格式。您最好使用前者,虽然您可能编写独立而特定的应用程序来分析后者。

    同转储一样,Xdebug 有若干个 php.ini 选项用于自定义跟踪内容。例如,下面一批设置将生成最详细的输出。


    清单 8. 跟踪自定义
                    
    xdebug.trace_format = 0
    xdebug.auto_trace = On
    xdebug.trace_output_dir = /tmp/traces
    xdebug.trace_output_name = trace.%c.%p
    
    xdebug.collect_params = 4
    xdebug.collect_includes = On
    xdebug.collect_return = On
    xdebug.show_mem_delta = On
    

    设定 xdebug.auto_trace = 1 将在执行所有 PHP 脚本之前先启用自动跟踪。另外,您可以通过代码设定 xdebug.auto_trace = 0,并分别使用 xdebug_start_trace()xdebug_stop_trace() 函数启用和禁用跟踪。但是,如果 xdebug.auto_trace1,则可以在包括配置好的 auto_prepend_file 之前先启动跟踪。

    选项 xdebug.trace_ouput_dirxdebug.trace_output_name 用于控制保存跟踪输出的位置。在这里,所有文件都被保存到 /tmp/traces 中,并且每个跟踪文件都以 trace 为开头,后接 PHP 脚本的名称(%s)以及进程 ID(%p)。所有 Xdebug 跟踪文件都以 .xt 后缀结尾。

    默认情况下,Xdebug 将显示时间、内存使用量、函数名和函数调用深度字段。如果将 xdebug.trace_format 设为 0,则输出将符合人类阅读习惯(将参数设为 1 则为机器可读格式)。此外,如果指定 xdebug.show_mem_delta = 1,则可以查看内存使用量是在增加还是在减少,而如果指定 xdebug.collect_params = 4,则可以查看传入参数的类型和值。要监视每个函数返回的值,请设定 xdebug.collect_return = 1

    接下来看另外一个示例。创建 /tmp/traces 目录,然后用 mkdir /tmp/traces; chmod a+rwx /tmp/traces 将其模式更改为能够被任何用户阅读的文件(world-readable)和能够被任何用户写入的文件(world-writable)(如果您不愿共享 traces 目录,请确保至少 Web 服务器用户 —— 通常为 www任何人 —— 可以将数据写入该目录)。将以上跟踪设置添加到 php.ini 文件中,重新启动 Web 服务器,然后把浏览器再次指向 phpinfo() 应用程序。整个跟踪应当类似清单 9 所示:


    清单 9. 整个跟踪
                    
    TRACE START [2007-06-06 14:04:55]
        0.0003       9440    +9440   -> {main}() /var/www/catalog/t/info.php:0
        0.0005       9440       +0     -> phpinfo() /var/www/catalog/t/info.php:1
                                       >=-> TRUE
                                     >=-> 1
        0.2351       9208
    TRACE END   [2007-06-06 14:04:55]
    

    在这里,main() 将调用 phpinfo(),后者将返回 TRUE。当 main() 退出时,它将返回 1。接下来,将浏览器指向 “最复杂的内容” 或系统中的其他某个 PHP 应用程序以生成更详细的跟踪。

    清单 10 显示了在计算第四个斐波纳契数列时上一篇文章中的 PHP Fibonacci 生成器的跟踪:


    清单 10. PHP Fibonacci 生成器跟踪
                    
    TRACE START [2007-06-06 14:17:17]
        0.0004      16432   +16432   -> {main}() /var/www/catalog/t/fibonacci.php:0
        0.0006      16696     +264     -> fib('4') /var/www/catalog/t/fibonacci.php:35
        0.0007      16696       +0       -> fib(3) /var/www/catalog/t/fibonacci.php:7
        0.0007      16736      +40         -> fib(2) /var/www/catalog/t/fibonacci.php:7
        0.0007      16848     +112           -> fib(1) /var/www/catalog/t/fibonacci.php:7
                                             >=> 1
        0.0008      16904      +56           -> fib(0) /var/www/catalog/t/fibonacci.php:7
                                             >=> 0
                                           >=> 1
        0.0009      16904       +0         -> fib(1) /var/www/catalog/t/fibonacci.php:7
                                           >=> 1
                                         >=> 2
        0.0009      16904       +0       -> fib(2) /var/www/catalog/t/fibonacci.php:7
        0.0009      16904       +0         -> fib(1) /var/www/catalog/t/fibonacci.php:7
                                           >=> 1
        0.0010      16904       +0         -> fib(0) /var/www/catalog/t/fibonacci.php:7
                                           >=> 0
                                         >=> 1
                                       >=> 3
                                     >=> 1
        0.0011      12528
    TRACE END   [2007-06-06 14:17:17]
    

    第一列显示时间,第二列是累计的内存使用量,第三列是增加的内存使用量,而第四列显示函数调用,包括参数。

    标有 >=> 的行显示每个函数的返回值(查找相应的缩进 -> 将调用与其返回值匹配起来)。此外,最后的 >=> 1main() 的返回值。

    如果使用 vim,Xdebug 的创造者 Derick Rethans 提供了专门针对 Xdebug 跟踪的一组语法加亮提示。提示包含在 Xdebug 源代码包内的 xt.vim 文件中。对于最近的 Linux 发行版,只需将 xt.vim 复制到 $VIMRUNTIME/syntax/xt.vim 中,然后运行 vim tracefile.xt。图 4 显示了 vim 中加亮的 Fibonacci 跟踪。


    图 4. Xdebug 跟踪的 vim 语法文件将使您可以轻松地进行分析
    vim 中加亮的跟踪





    回页首


    结束语

    分享这篇文章……

    digg 将这篇文章提交到 Digg
    del.icio.us 发布到 del.icio.us
    展开全文
  • 【解析题】在下列选项,()是计算机程序。【解析题】计算机病毒的特点不包括( )。【解析题】使用 Cache 可以提高计算机运行速度,这是因为【解析题】下列不属于计算机特点的是:【解析题】1968年6月,世界上最早的...

    答案

    查看答案

    解析:

    【解析题】所谓______就是计算机中实现各个部件之间通信的公共通道。

    【解析题】有些问题虽然无法用数学语言描述并证明,但可以用计算机进行计算解决。

    【解析题】在下列选项中,()是计算机程序。

    【解析题】计算机病毒的特点不包括( )。

    【解析题】使用 Cache 可以提高计算机运行速度,这是因为

    【解析题】下列不属于计算机特点的是:

    【解析题】1968年6月,世界上最早的计算机网络是(? )。

    【解析题】从基本元器件的角度看,第四代计算机可称为( )计算机

    【解析题】微型计算机键盘上CAPSLOCK键是_____。

    【解析题】()体现一个国家计算机科学水平的高低,也能反映一个国家的经济和科学技术实力

    【解析题】冯诺依曼计算机的五大组成部件有()

    【解析题】.在计算机系统中,I/O接口位于( )之间。

    【解析题】办公自动化是计算机的一项应用,按计算机应用的分类,它属于

    【解析题】信息加工取向的认知心理学注重人脑与计算机的类比,能够很好地解释人类对复杂认知任务的完成。

    【解析题】计算机中的图形根据原理的不同分为

    【解析题】计算机操作系统的最基本特征是

    【解析题】字长是计算机的一个重要指标,在工作频率不变和CPU体系结构相似的前提下,字长与计算机性能的关系是()。

    【解析题】计算机网络中,数据传输速度常用的单位是__________。

    【解析题】“神舟七号”飞船应用计算机进行飞行状态调整属于

    【解析题】在TRIZ理论的发明原理中,“通过计算机虚拟现实﹐而不去进行昂贵的度假"是利用了40个发明原理中的()。

    【解析题】计算机病毒产生的原因是__________。

    【解析题】简述计算机的发展过程。

    【解析题】为网络提供共享资源并对这些资源进行管理的计算机称之为( )。

    【解析题】计算机网络的分类有哪些?

    【解析题】下列哪个不属于计算机的发展方向是( )。

    【解析题】计算机网络基本知识试题附答案.doc/js/editor20150812/dialogs/attachment_new/fileTypeImages/icon_doc.gif

    【解析题】计算机网络技术包含的两个主要技术是计算机技术和

    【解析题】在下列关于计算机语言的说法中,正确的是( )

    【解析题】不得利用计算机信息系统从事危害国家利益、集体利益和公民合法利益的活动,不得危害计算机信息系统的安全

    【解析题】计算机网络中进行数据交换而建立的规则、标准或约定的集合称为()

    【解析题】微型计算机中的内存容量主要指( )的容量。

    【解析题】化工厂中用计算机系统控制物料配比、温度调节、阀门开关的应用属于( )。

    【解析题】现在常用的计算机网络操作系统有().

    【解析题】用C语言编写的源程序,必须翻译成用二进制指令表示的目标程序,才能被计算机识别,这个过程称为???(??? )。

    【解析题】咨询、计算机与信息服务同都是高附加值的服务贸易。()

    【解析题】作为现代计算机理论基础的冯·诺依曼原理和思想是______。

    【解析题】下列因素中,对微型计算机工作影响最小的是()

    【解析题】在微机的硬件系统中,______是计算机的记忆部件

    【解析题】计算机指令由______组成。

    【解析题】关闭 Windows7相当于关闭计算机

    【解析题】一般认为,世界上第一台电子数字计算机诞生于______

    【解析题】__________是研究计算机及其周围各种现象和规律的科学。

    【解析题】计算机病毒造成计算机()的损坏

    【解析题】构成计算机网络的拓扑结构有很多种,通常有星形、()、环型、树型和网状型。

    【解析题】在多媒体计算机中常用的图象输出设备是哪些______。

    【解析题】用计算机软件绘制思维导图和手绘思维导图各有优势

    【解析题】目前,计算机网络安全的关键技术有( )

    【解析题】计算机中,文件属性是人们了解一个文件的重要途径,通过文件属性,可以了解到文件存放的位置、类型、大小、创建时间、修改时间等信息

    【解析题】按网络的拓扑结构来划分,计算机网络的类型不包括

    【解析题】计算机专业发展30年,我院在 ( ) 年获四川省首批“计算机与信息科学人才培养基地”。

    相关问题:

    1、【解析题】 计算机之所以能够按照人们的意志自动进行工作,主要是因为采用了_____。

    2、【解析题】 用来控制、指挥和协调计算机各部件工作的是______

    3、【解析题】 控制器的发展历程包括:机械式、模拟电路、数字计算机。

    4、【解析题】 计算机安全阶段的主要威胁是搭线窃听和密码学分析。

    5、【解析题】 以下不属于计算机网络的主要功能的是().

    6、【解析题】 1 .计算机硬件能直接识别和运行的只能是 _______ 程序。

    7、【解析题】 main函数是C程序的入口,由计算机系统负责调用。

    8、【解析题】 计算机中的所有信息都是以ASCII码的形式存储在机器内部的。

    9、【解析题】 计算机辅助教学课件设计的原则有( )。

    10、【解析题】 下列计算机应用中,属于计算机辅助教学的是().

    11、【解析题】 个人计算机简称为PC机,这种计算机属于__________。

    12、【解析题】 计算机应包括( )等功能部件?。

    13、【解析题】 计算机科学与计算机工程学科的界定是:前者着重于理论与算法,后者着重于技术与工程实践

    14、【解析题】 在数据库设计中,概念设计阶段用()来描述信息结构但不涉及信息在计算机中的表示。

    15、【解析题】 下列属于计算机高级程序设计语言特点的是( )

    16、【解析题】 关于计算机病毒,下面哪一个说法是正确的().

    17、【解析题】 计算机系统中的存储系统是指( )。

    18、【解析题】 在计算机内部,一切信息是以()表示。

    19、【解析题】 TCP/IP协议标准将计算机网络通信的技术实现划分为应用层、传输层、网络互连层等,其中HTTP协议属于________ 层。

    20、【解析题】 描述计算机网络中数据通信的基本技术参数是数据传输速率与 。

    21、【解析题】 组成一个计算机系统的两大部分是____。

    22、【解析题】 原文:科学家们认为, 计算机不可能在所有领域中都代替人。译文: Scientists do not believe that computers can replace man in every field.

    23、【解析题】 计算机工作最重要的特征是。

    24、【解析题】 冯·诺依曼计算机的基本原理是_____

    25、【解析题】 按计算机是否专门用于某一方面,可以把计算机分为_______

    26、【解析题】 人们把以______为硬件基本电子器件的计算机系统称为第三代计算机。

    27、【解析题】 下面有关计算机的叙述中,错误的是().

    28、【解析题】 为组合框Combo1增加数据项“计算机”,下列哪个命令是正确的____。

    29、【解析题】 在计算机的发展历程中,第四代计算机是以什么为标志?

    30、【解析题】 第一代电子计算机的主要组成元件是______。

    31、【解析题】 计算机硬件系统主要包括:运算器、存储器、输入设备、输出设备和__________。

    32、【解析题】 计算机的中央处理器只能直接调用( )中的信息。

    33、【解析题】 计算机能够进行自动处理的基础是______。

    34、【解析题】 计算机科学的奠基人是__________。

    35、【解析题】 为了具体说明计算方法的研究对象,考察用计算机解决科学技术和工程问题时经历的几个过程________

    36、【解析题】 计算机软件按其用途和实现的功能可分为系统软件和应用软件两大类。

    37、【解析题】 下列属于应用软件的是()。I.计算机辅助教学软件II.软件测试工具 III.办公自动化软件IV.工程与科学计算软件

    38、【解析题】 完整的计算机系统由()组成。

    39、【解析题】 中国大学MOOC: 完整的计算机系统由( )两大部分组成。

    40、【解析题】 一般将使用高级语言编写的程序称为源程序,它不能直接在计算机中运行,需要有相应的语言处理程序将其翻译成机器语言程序才能执行。

    41、【解析题】 “计算机网络的建立与普及将彻底改变人类生存及生活的模式,而控制与掌握网络的人就是人类未来命运的主宰。谁掌握了信息、控制了网络,谁就将拥有整个世界”是谁说的?()

    42、【解析题】 计算机最早的应用领域是______。

    43、【解析题】 中国大学MOOC: 按照网络拓扑结构划分,计算机网络可以分为以下几类( )。

    44、【解析题】 计算机病毒的生命周期:开发期→传染期→潜伏期→发作期→发现期→消化期→消亡期。

    45、【解析题】 计算机系统中的所有文件一般可分为可执行文件和非可执行文件两大类,可执行文件的扩展名为exe或com

    46、【解析题】 在相同的计算机环境中,______处理速度最快。

    47、【解析题】 在计算机程序设计语言中,可以直接被计算机识别并执行的只有( )

    48、【解析题】 下列属于计算机病毒的特征是( )

    49、【解析题】 中国大学MOOC: 计算机字长为8位,若x = - 1101101,则[x/4]补的值为 (直接填写二进制数)

    50、【解析题】 在计算机网络中,通信介质包含()

    展开全文
  • 第1章 Python程序设计概述单元测验11、下列选项,不属于Python语言特点的是A、面向对象B、运行效率高C、可读性好D、开源2、以下叙述正确的是A、Python3.x和Python2.x兼容B、Python语言只能以程序方式执行C、Python...

    第1章 Python程序设计概述

    单元测验1

    1、下列选项中,不属于Python语言特点的是

    A、面向对象

    B、运行效率高

    C、可读性好

    D、开源

    2、以下叙述正确的是

    A、Python3.x和Python2.x兼容

    B、Python语言只能以程序方式执行

    C、Python是解释性语言

    D、Python语言出现的晚,具有其他高级语言的一切优点

    3、下列关于Python的说法中,错误的是

    A、Python是从ABC语言发展起来的

    B、Python是一门高级的计算机语言

    C、Python是一门只面向对象的语言

    D、Python是一种代表简单主义思想的语言

    4、python程序文件的扩展名是

    A、.python

    B、.py

    C、.pt

    D、.pyt

    5、Python语言属于

    A、机器语言

    B、汇编语言

    C、高级语言

    D、科学计算语言

    6、Python这个单词是什么含义?‪‪‪‪‪‪‪‪‪‪‪‫‪

    A、喵星人

    B、蟒蛇

    C、石头

    D、袋鼠

    7、Python语言采用严格的“缩进”来表明程序的格式框架。下列说法不正确的是:‪‪‪‪‪‪‪‪‪‪‪‫‪

    A、缩进指每一行代码开始前的空白区域,用来表示代码之间的包含和层次关系。

    B、代码编写中,缩进可以用Tab键实现,也可以用多个空格实现,但两者不混用。

    C、“缩进”有利于程序代码的可读性,并不影响程序结构。

    D、不需要缩进的代码顶行编写,不留空白。

    8、下列选项中,不属于Python语言特点的是

    A、面向对象

    B、运行效率高

    C、可读性好

    D、开源

    9、在Python集成开发环境中,可使用()快捷键运行程序。

    A、Ctrl+S

    B、F5

    C、Ctrl+N

    D、F1

    10、Python是一种跨平台、开源、免费的高级动态编程语言。

    11、在windows平台上编写的Python程序无法在Unix平台运行。

    12、Python既支持面向对象编程,也支持面向过程编程模式。

    第2章 数据类型、运算符和表达式

    单元测试2

    1、表达式16/4-2**5*8/4%5/2的值为

    A、14

    B、4

    C、2.0

    D、2

    2、计算表达式 1234%1000//100 的值为

    A、1

    B、2

    C、3

    D、4

    3、下列表达式的值为True的是

    A、2!=5 or 0

    B、3>2>2

    C、1 and 5==0

    D、1 or True

    4、与关系表达式x==0等价的表达式是

    A、x=0

    B、not x

    C、x

    D、x!=1

    5、Python表达式中,可以控制运算优先顺序的是

    A、圆括号()

    B、方括号[]

    C、大括号{}

    D、尖括号<>

    6、关于Python中的复数,下列说法错误的是

    A、表示复数的语法是real+imagej

    B、实部和虚部都是浮点数

    C、虚部必须后缀j,且必须是小写

    D、complex(x)会返回以x为实部,虚部为0的复数

    7、下面哪个不是Python合法的标识符

    A、int32

    B、40XL

    C、self

    D、_name_

    8、下列哪个语句在Python中是非法的?

    A、x=y=z=1

    B、x=(y=z+1)

    C、x,y=y,x

    D、x+=y

    9、已知x=2,语句x*=x+1执行后,x的值是

    A、2

    B、3

    C、4

    D、6

    10、下列表达式中,值不是1的是

    A、4//3

    B、15%2

    C、1 and True

    D、1 or True

    11、Python 语句x=’car’; y = 2; print (x+y)的输出结果是

    A、2

    B、"car2’

    C、"carcar’

    D、语法错

    12、Python 表达式math.sqrt(4)*math.sqrt(9)的值为

    A、6.0

    B、36.0

    C、13.0

    D、6

    13、一个变量只能存储一个字符

    14、程序中的变量代表内存中的一个存储单元,它的值不可以随时修改

    15、python中,一个字符型数据与整型数据可以互相赋值。

    16、语句标号用标识符表示,它的定名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线

    17、逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符

    18、关系表达式的值是一个逻辑值,它的值为“真”或“假”。逻辑表达式的值也是一个逻辑量,它的值也为“真”或“假”

    19、python中认为名为Student和student的变量是不同变量

    20、用户所定义的标识符允许使用关键字

    21、已知x = 3,那么赋值语句x = "abcedfg"是无法正常执行的

    22、python变量使用前必须先声明,并且一旦声明就不能在当前作用域内改变其类型了

    23、在python中可以使用if作为变量名

    24、加法运算符可以用来连接字符串并生生成新的字符串

    25、3+4j不是合法的python表达式

    26、4j是合法python数字类型

    27、一个数字5也是合法的python表达式

    第3章 输入与输出

    在线练习3

    1、Python语句print(0xA+0xB)的运行结果是:

    A、0xA+0xB

    B、A+B

    C、0xA0xB

    D、21

    2、为了给整型变量a、b、c赋初值10,下面正确的python语句是:

    A、xyz=10

    B、x=10 y=10 z=10

    C、x=y=z=10

    D、x=10,y=10,z=10

    3、已知字符"A"的ASCII值是65,字符变量c1的值是"A",c2的值是"D",执行语句print("%d,%d"%(c1,ord(c2)-2))后,输出结果是:

    A、A,B

    B、A,66

    C、65,66

    D、65,B

    4、语句x=input()执行时,如果从键盘输入12并按回车键,则x的值是:

    A、12

    B、12.0

    C、"12"

    D、(12)

    5、Python 3.x语句 print(1, 2, 3, sep=":") 的输出结果是:

    A、1 2 3

    B、123

    C、1:2:3

    D、1,2,3

    6、在Python 3.x中,使用内置函数input()接收用户输入时,不论用户输入的什么格式,一律按字符串进行返回

    7、Python运算符%不仅可以用来求余数,还可以用来格式化字符串。

    8、为了输出",可以使用如下语句print(""")。

    9、Python变量名区分大小写,所以student和Student不是同一个变量。

    10、字符串"Hello Python"中" "表示换行。

    编程题目3

    1、输入一矩形的长和宽,计算并输出矩形的面积。

    2、输入三个整数,求这三个数的和以及平均值,并在屏幕上输出。

    3、输入一个三位整数x(999=>x>=100),将其分解出百位、十位、个位,并求出各位之和以及各位之积

    4、已知三角形的三边 a、b、c,,求其面积S。(提示:假设有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:S=sqrt(p(p-a)(p-b)(p-c)),而公式里的p是半周长:p=(a+b+c)/2

    5、从键盘上输入一个大写字母,将该大写字母转换成小写字母并输出。

    第4章 选择结构程序设计

    在线练习4

    1、执行下列Python语句将产生的结果是( )。 x=2 y=2.0 if(x==y): print(“Equal”) else: print(“No Equal”)

    A、Equal

    B、Not Equal

    C、编译错误

    D、运行时错误

    2、下列程序运行结果是 a=3 b=5 if a>b: a,b=b,a print ("从小到大输出:") print(a,b)

    A、3 5

    B、从小到大输出: 3 5

    C、从小到大输出: 3,5

    D、从小到大输出:3,5

    3、if else是

    A、判断结构

    B、选择结构

    C、分支结构

    D、循环结构

    4、python语言对嵌套if语句的规定是:else总是与

    A、其之前最近的if配对

    B、第一个if配对

    C、缩进位置相同的if配对

    D、其之前最近且尚未配对的if配对

    5、当你输入95时,下列程序运行的结果是 results = int(input("成绩为:")) if 100>=results>=90: print("A") elif 90>results>=75: print("B") elif 0<=results<75: print("C") else: print("输入错误!")

    A、A

    B、B

    C、C

    D、输入错误!

    6、如下代码可以实现当输入6的时候输出x>5,输入4的时候输出 3<=5,输入1的时候输出x<=3

    7、如下两段代码功能一样,程序结构也一样 第一段: if a < 0: print("<0") if a == 0: print("=0") if a > 0: print("a>0") 第二段: if a < 0: print("<0") elif a == 0: print("=0") elif a > 0: print("a>0")

    编程题目4

    1、求一元二次方程的解

    2、求x到y之间(包含x,y)所有的素数

    3、求最大值

    4、字符串统计

    5、整数排序

    第5章 循环结构程序设计

    在线练习5

    1、执行range(2,10,2)后运行结果是:

    A、[2,4,6,8]

    B、[2,4,6,8,10]

    C、(2,4,6,8)

    D、(2,4,6,8,10)

    2、选出对下列语句不符合语法要求的表达式: for var in _________ : print(var)

    A、range(0,10)

    B、”Hello”

    C、(1,2,3)

    D、{1,2,3,4,5}

    3、若k为整形, 下述while循环执行的次数为 k=1000 while k>1: print(k) k = k/2

    A、9

    B、10

    C、11

    D、1000

    4、下列for循环执行后,输出结果的最后一行是 for i in range(1,3): for j in range(2,5): print(i*j)

    A、2

    B、6

    C、8

    D、15

    5、下列程序的结果是 sum=0 for i in range(100): if(i%10): continue sum=sum+i print(sum)

    A、5050

    B、4950

    C、450

    D、45

    6、下面程序中语句print(i*j)共执行了_次。 for i in range(5): for j in range(2,5): print(i*j)

    A、12

    B、14

    C、15

    D、20

    7、下面哪个语句不能完成1到10的累加功能, total初值为0。

    A、for i in range(10,0):total+=i

    B、for i in range(1,11):total+=i

    C、for i in range(10,0,-1):total+=i

    D、for i in (10,9,8,7,6,5,4,3,2,1):total+=i

    8、for i in range(10): …… 中 ,i的循环终值是

    A、9

    B、10

    C、11

    D、12

    9、下面代码的输出结果是 for i in range(3): print(5,end=",")

    A、5,5,5

    B、5,5,5,

    C、5 5 5,

    D、5 5 5

    10、continue语句用于

    A、退出循环程序

    B、结束本次循环

    C、空操作

    D、引发异常处理

    11、如果仅仅是用于控制循环次数,那么使用for i in range(20)和for i in range(20, 40)的作用是等价的。

    12、带有else子句的循环如果因为执行了break语句而退出的话,则会执行else子句中的代码。

    13、for n in range(2,8,2): print(n,end=" ") 这段程序输出结果是:2 4 6

    14、强制退出当前所在循环结构的关键字是continue。

    15、语句while (!y):中的!y等价于y!=0。

    16、continue用来跳出最内层for或while循环,退出该循环后程序从循环代码后继续执行; break用来结束当前当次循环。

    17、在Python语言里,循环结构必须有else子句。

    编程题目5

    1、求S的和。

    2、图形打印。

    3、追查车号。

    第6章 序列

    在线练习6

    1、已知x=[1,2,3],执行语句x.append(5)之后,x的值是什么

    A、[1,2,3,5]

    B、[1,2,3]

    C、[5]

    D、5

    2、list("abcd")的结果是

    A、"abcd"

    B、["a", "b", "c", "d"]

    C、["abcd"]

    D、"a", "b", "c", "d"

    3、已知list1 = [1, 2, 3, 4, 5, 4, 3, 2, 1],list1[:-1]的值是

    A、[1, 2, 3, 4, 5, 4, 3, 2, 1]

    B、[0, 1, 2, 3, 4, 3, 2, 1, 0]

    C、[1, 2, 3, 4, 5, 4, 3, 2]

    D、[1]

    4、已知x=[8,7,6,5,4,3,2,1],那么x.pop(2)的结果是

    A、2

    B、3

    C、6

    D、7

    5、能将5加到列表list1的末尾的语句是

    A、list1.add(5)

    B、list1.insert(5)

    C、list1.extend(5)

    D、list1.append(5)

    6、假设: ls=[1,2,3,4,5] lt=ls ls[4]=1 print(lt[4]) 输出结果是:

    A、1

    B、3

    C、4

    D、5

    7、字符串函数strip()的作用是

    A、连接两个字符串序列

    B、替换字符串中特定字符

    C、按照指定字符分割字符串为数组

    D、去掉字符串两侧空格或指定字符

    8、#003200390035003700391575193417527获得字符串s长度的方法是什么

    A、s.len()

    B、s.length()

    C、len(s)

    D、length(s)

    9、字符串是一个字符序列,对字符串s,从右侧向左第3个字符使用哪种方式索引

    A、s[3]

    B、s[-3:]

    C、s[0:-3]

    D、s[-3]

    10、x=(4, 5, 6),执行如下代码会有什么结果? x[1] = 1 print(x)

    A、(4,1,6)

    B、(1,5,6)

    C、(4,1,5,6)

    D、出错

    11、对于字典d={"abc":1,"qwe":3,"zxc":2} ,len(d)的结果是( )。

    A、3

    B、6

    C、12

    D、1

    12、以下关于字典的说法错误的是( )。

    A、字典中元素以键信息为索引访问。

    B、字典中,一个键信息只对应一个值信息。

    C、字典可以对键信息赋值。

    D、字典的长度是不可变的。

    13、以下关于列表的描述错误的是( )。

    A、元素类型可以不同

    B、必须按顺序插入元素

    C、长度没有限制

    D、支持in运算符

    14、Python列表、元组、字符串都属于有序序列。

    15、元组tuple是属于可变对象。

    16、已知x是一个列表,那么x = x[3:] + x[:3]可以实现把列表x中的所有元素循环左移3位。

    17、元组是不可变的,不支持列表对象的inset()、remove()等方法,也不支持del命令删除其中的元素,但可以使用del命令删除整个元组对象。

    18、语句a = 1,2,3有语法错误。

    19、已知x是个列表对象,那么执行语句y = x之后,对y所做的任何操作都会同样作用到x上。

    20、使用Python列表的方法insert()为列表插入元素时不会改变列表中插入位置之后元素的索引。

    21、tuple(x):可以用于生成元组,输入的参数可以是任何组合数据类型。

    22、字符串对象和元组对象是不可变对象,列表对象为可变对象。

    23、已知st="Hello World!",使用print(st[0:-1])语句可以输出字符串变量st中的所有内容。

    24、字符串"Hello Python"中" "表示换行。

    编程题目6

    1、列表去重

    2、删除指定字符

    3、列表排序

    4、杨辉三角

    第7章 字典和集合

    在线练习7

    1、以下哪个方式可以创建一个空的集合?

    A、set()

    B、{}

    C、[]

    D、()

    2、以下哪一句会得到{"1","2","3"}?

    A、list("123")

    B、tuple("123")

    C、set("123")

    D、dict("123")

    3、对于两个集合s1和s2,s1 < s2的指

    A、s1的大小小于s2的大小

    B、s1的元素比s2的小

    C、s1是s2的真子集

    D、s2是s1的真子集

    4、对于集合s,以下哪个操作是不存在的?

    A、len(s)

    B、s.append(1)

    C、max(s)

    D、s - {1}

    5、对于正确的表达式a[2],a不可能是以下哪个类型?

    A、列表

    B、元组

    C、字典

    D、集合

    6、元组可以作为字典的“键”。

    7、Python字典中的“值”不允许重复。

    8、Python支持使用字典的“键”作为下标来访问字典中的值。

    9、在字典里,同一个键可以对应两个或多个值。

    10、如果a是一个列表,则语句a=list(set(a))可以删除a中的重复元素。

    11、表达式 {1, 3, 2} > {1, 2, 3} 的值为True。

    12、Python集合中的元素不允许重复。

    13、a={},type(a)结果是 。

    14、set(x):可以用于生成集合,输入的参数可以是任何组合数据类型,返回结果是一个无重复且有序的集合。

    15、Python集合中的元素可以是元组。

    16、Python字典和集合支持双向索引。

    17、Python字典和集合属于无序序列。

    编程题目7

    1、统计并输出字符串中小写元音字母的个数

    2、能被7、9和11整除的数的个数(用集合实现)

    第8章 函数

    在线练习8

    1、对于函数定义代码的理解,正确的是

    A、必须存在形参

    B、必须存在return语句

    C、形参和return语句都是可有可无的

    D、形参和return语句要么都存在,要么都不存在

    2、在一个函数中如局部变量和全局变量同名,则

    A、局部变量屏蔽全局变量

    B、全局变量屏蔽局部变量

    C、全局变量和局部变量都不可用

    D、程序错误

    3、下面程序段的输出为 def f1(a,b,c): print(a+b) nums=(1,2,3) f1(nums)

    A、1

    B、3

    C、6

    D、语法错

    4、以下哪个函数定义正确:

    A、def func1(): return 1

    B、def func1() return 1

    C、def func1(): x = 5 y = 6 return x+y

    D、def func1(): pass

    5、print(type(lambda:3))的输出结果是

    A、 B、 C、 D、 6、下面程序段的输出为 a=1 def fun(a): a=a+2 print(a) fun(a) print(a)

    A、3 1

    B、4 1

    C、1 1

    D、3 3

    7、下面关于函数的说法,正确的是

    A、函数可以不定义,就可以直接使用

    B、函数是程序的抽象,通过封装实现代码复用,可以利用函数对程序进行模块化设计

    C、函数定义的位置没有要求,可以先调用,最后对函数定义

    D、函数不可以对自己调用,只能调用别的函数

    8、如果函数定义为def hello(username): ,则对该函数的调用不合法的是

    A、hello ("Alice")

    B、hello ("Alice")

    C、hello ()

    D、hello (username=" Alice")

    9、以下关于Python内置函数的描述,错误的是

    A、sorted() 对一个序列类型数据进行排序,将排序后的结果写回到该变量中

    B、id() 返回一个变量的一个编号,是其在内存中的地址

    C、max()返回一个序列类型数据中最大值

    D、type() 返回一个对象的类型

    10、在Python中导入其他函数库的关键字是

    A、include

    B、from

    C、import

    D、into

    11、以下哪个程序段是使用递归函数实现1到100求和

    A、def product1(num): product=1 for i in range(1,num+1): product=product *i return product print(product1(10))

    B、def sum1(num): sum2=0 for i in range(1,num+1): sum2+=i return sum2 print(sum1(100))

    C、def product2(num): if num==1: return 1 else: return num *product2(num-1) print(product2(10))

    D、def sum_a(num1): if num1==1: return 1 else: return num1+sum_a(num1-1) print(sum_a(100))

    12、在函数中使用return语句可以返回值,所以函数中的return语句后一定要有值。

    13、定义函数时,即使该函数不需要接收任何参数,也必须保留一对空的圆括号来表示这是一个函数。

    14、定义Python函数时必须指定函数返回值类型。

    15、定义函数时,带有默认值的参数必须出现在参数列表的最右端,任何一个带有默认值的参数右边不允许出现没有默认值的参数。

    16、在调用函数时,可以通过关键参数的形式进行传值,从而避免必须记住函数形参顺序的麻烦。

    在线作业

    1、实现一个计算非负整数阶乘的简单函数,并利用该函数求 1!+2!+3!+...+n! 的值。

    2、求鞍点

    结业考试

    1、下面哪个不是Python合法的变量名( )

    A、my

    B、__name__

    C、10XL

    D、x32

    2、下面的循环体执行的次数与其它不同的是:( )

    A、for i in range(100): print(i)

    B、for i in range(100,0,-1): print(i)

    C、i=0 while(i<=100): print(i) i=i+1

    D、i = 100 while(i>0): print(i) i=i-1

    3、使用Python语言编写的源程序保存时的文件扩展名是( )。

    A、.java

    B、.txt

    C、.py

    D、.class

    4、已知x=2,语句x*=x+1执行后,x的值是( ).

    A、6

    B、2

    C、3

    D、9

    5、下列哪个语句在Python中是非法的?

    A、x=y=z=1

    B、x=(y=z+1)

    C、x,y=y,x

    D、x+=y

    6、Python 3.x中,语句x=input()执行时,如果从键盘输入12并按回车键,则x的值是:( )

    A、12

    B、12.0

    C、(12)

    D、"12"

    7、下列程序运行结果是: a=3 b=5 if a>b: a,b=b,a print ("从小到大输出:") print (a,b)

    A、3,5

    B、3 5

    C、5,3

    D、5 3

    8、若k为整形, 下述while循环执行的次数为:( ) k=1000 while k>1: print(k) k = k/2

    A、10

    B、9

    C、11

    D、1000

    9、下列程序的结果是:( ) sum=0 for i in range(100): if(i%10): continue sum=sum+i print(sum)

    A、45

    B、5050

    C、450

    D、4950

    10、以下关于元组的描述正确的是( )

    A、创建元组tup:tup = ()

    B、创建元组tup:tup = (50)

    C、元组中的元素允许被修改

    D、元组中的元素允许被删除

    11、下列程序运行结果是:( ) a=[1,2,1,2,3,3,3,3] result=0 for i in a: result+=i print (result)

    A、16

    B、15

    C、17

    D、18

    12、已知列表x = list(range(5)),那么执行语句x.remove(3)之后,表达式x.index(4)的值为:( )

    A、4

    B、3

    C、1

    D、2

    13、以下不能创建一个字典的语句是( )

    A、dict4 = dict(([1,2],[3,4]))

    B、dict1 = {}

    C、dict4 = {3:5}

    D、dict3 = dict([2,5],[3,4])

    14、以下叙述正确的是:( )

    A、Python3.x和Python2.x兼容

    B、Python是解释性语言

    C、Python语言只能以程序方式执行

    D、Python语言出现的晚,具有其他高级语言的一切优点

    15、为了给整型变量x、y、z赋初值10,下面正确的python语句是:( )

    A、x=10 y=10 z=10

    B、x=10,y=10,z=10

    C、xyz=10

    D、x=y=z=10

    16、python语言对嵌套if语句的规定是:else总是与()

    A、缩进位置相同的if配对

    B、其之前最近的if配对

    C、其之前最近且尚未配对的if配对

    D、第一个if配对

    17、下列for循环执行后,输出结果的最后一行是: for i in range(1,3): for j in range(2,5): print(i*j)

    A、6

    B、2

    C、8

    D、15

    18、Python是一种跨平台、开源、免费的高级动态编程语言。

    19、逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符

    20、在python中可以使用if作为变量名.

    21、3+4j不是合法的python表达式.

    22、已知x = 3,那么赋值语句x = "abcedfg"是无法正常执行的.

    23、程序中的变量代表内存中的一个存储单元,它的值不可以随时修改.

    24、如果仅仅是用于控制循环次数,那么使用for i in range(20)和for i in range(20, 40)的作用是等价的。

    25、for n in range(2,8,2): print(n,end=" ") 这段程序输出结果是:2 4 6

    展开全文
  • 相关问题SPSS Statistics 的主要功能( ): SPSS Statistics 功能 p 以上 /p防范人质绑架的技巧包括(): 人质 技巧 睡觉 标记 斗智斗勇智接触化学危险品、剧毒以及致病微生物等的仪器设备和器皿,必须明确醒目的标记...
  • Linux定期运行程序

    千次阅读 2004-12-14 08:30:00
    Linux定期运行程序文/ heiyeluren定期运行程序或者脚本是管理员要面临一个很普遍的问题,我刚搞Linux,稍微总结一下。(以下操作基于Redhat9)一、 使用crond监控程序运行程序1. 使用cron来定期执行任务使用crond ...
  • java金字塔程序Pattern programs are used a lot in interviews to understand the logical thinking abilities of the interviewee. Pyramid patterns are very popular and once we get the logic on the way it’...
  • C语言程序由什么组成 ?______A. 子程序B. 主程序和子程序C. 函数D. 过程更多相关问题下列哪项关于独立性的论述是正确的()。A.独立性可能受经济利益威胁、自我评价威胁、关联关系威胁、心悸失眠兼自汗、盗汗宜首选:...
  • c++程序设计基础(第五版)(上) 习题与解答

    万次阅读 多人点赞 2019-09-09 20:06:44
    C++程序设计基础(第5版)(上) 习题与解答 第1章练习题 同步练习1.1 一、选择题 1.一个最简单的C++程序,可以只有一个( )。 (A)库函数 (B)自定义函数 (C)main函数 (D)空函数 2.函数名是( ),用于...
  • HTML5 应用程序缓存

    千次阅读 2016-06-28 20:32:22
    2、什么是应用程序缓存(Application Cache)?  HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问。应用程序缓存为应用带来三个优势:  离线浏览 - 用户可在应用离线时...
  • /* 程序头部注释开始(为避免提交博文遇到的问题,将用于表明注释的斜杠删除了) * 程序的版权和版本声明部分 * All rights reserved. * 文件名称: txt.c * 作 者: liuyongshui * 问 题: 编程序输出...
  • 下列表达式,正确的表达式是:A、p=s+5B、s=p+sC、*p=s[0] D、s[2]=p[4]3、若int *px; float *pf;char *pc;,下列关于指针的正确描述为( )。A、px与pf存储单元长度一样。 B、px与pc存储单元长度一样。C、pc...
  • 2014秋C++ 第9周项目 循环程序设计

    千次阅读 2014-10-20 09:13:53
    阅读程序 程序分析题,阅读下列程序,写出程序的运行结果,建议在上机时进行验证(云学堂将给出代码,直接复制到C4droid或CodeBlocks运行即可),如果与自己的预期出入,尤其注意对照找出问题。
  • Window系统批处理程序的语法

    千次阅读 2007-03-13 14:08:00
    批处理文件是无格式的文本...使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。当然我们的这个版本的主要内容是介绍批处理在入侵一些实际运用,例如我们后面要提到的用批处理文件来给系统打补丁
  • [zz]C64x系列DSP/BIOS设备驱动程序的设计1 为了高效地对外部设备进行控制,给硬件设备编写驱动程序是一种有效的解决方法。C64x系列的DSP系统提出了类/微型驱动模型的驱动程序结构。实践结果表明,采用类/...
  • ASP.NET程序设计复习题

    千次阅读 2019-12-23 22:18:48
    一.填空题 (1)ASPX网页的代码储存模式两种,它们是代码分离模式和单一模式。...(3)请将下列数据(nn )在TextBox 控件显示出来。 Double nn = 4512.6; TextBox1.Text =nn.Tostring(); (4)下面是一个...
  • PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新) 实现语言:C/C++; 欢迎各位看官交流讨论、指导题解错误;或者分享更快的方法!! 题目链接:...
  • 1. 这本书对Python的知识点的描述很详细,而且排版看的很舒服. 2. 几个例题:假装自己从零开始学,将一些代表性、有意思的例题抽取出来. 3. 还有自己对一部分课后复习题,全部课后上机实践题的解题思路
  • 只要微型驱动创建了规定的函数,应用程序就可以方便地通过DIO适配模块、PIO适配模块或(和)GIO类驱动调用。这些规定的函数包括:通道绑定函数(md—BindDev)、通道创建/删除函数(mdCreateChan/md—DeleteChan)、I/O...
  • ** ASP.NET程序设计复习题 ** 一.填空题 ...请将下列数据(nn )在TextBox 控件显示出来。 Double nn = 4512.6; TextBox1.Text = nn.Tostring(); (4) 下面是一个转移到新网页的指令:R
  • 一套功能强大的管理系统,除了最基本的图文系统,内还包括了一些特殊的插件,都包含再了后台菜单的【附加功能】里了,具体插件有下列几项【就特殊的几个插件做下介绍】: 1、意见建议:类似留言本的功能,不过是保密...
  • JAVA调用C语言程序

    2020-08-27 13:42:00
    JAVA调用C语言程序JAVA调用C语言程序1. 编写带native声明的方法的Java类2. 使用javah 生成:jniSample.h的头文件3. 使用C实现本地sum方法:(这里我生成文件时候,误写了jinSample)。4. 将本地方法编写的文件生成...
  • JavaScript 高级程序设计(第3版)

    千次阅读 2018-04-12 10:44:16
    《JavaScript 高级程序设计(第3版)》这一版除增加5章全新内容外,其他章节也较大幅度的增补和修订,新内容篇幅约占三分之一。全书从 JavaScript 语言实现的各个组成部分——语言核心、DOM、BOM、事件模...
  • 第一空(i-1)%3!=0 || i-1==0 第二空(i-1)%3==0
  • 通常来说,我们写答题程序的时候,拿到手的题库不会是json格式的,而是word或txt、pdf就像考试卷子那样的。 这里写一下用python3将普通题库处理成json格式,选择python3的原因是,相对于2.7版本,它对中文更友好。 ...
  • js是一门弱类型的程序语言,但是它区分大小写,包括但不限于变量、函数名、操作符。如test和Test、tesT是3个不同的变量。 标示符 标示符,就是指变量、函数、属性名或函数的参数名,标示符由下列方式组成: 第...
  • Python语言程序设计基础-题库

    千次阅读 多人点赞 2020-12-18 15:18:53
    1、关于测试一个中等规模程序的说法,以下错误的是()。 A、 从结构图最底层开始,逐步上升 B、 先运行测试每一个基础函数,再测试由基础函数组成的整体函数 C、 直接运行程序 D、 采用自底向上的执行方式 答案: C...
  • c语言预处理程序与注释(#error)

    千次阅读 2013-08-28 17:29:15
    C程序的源代码可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。 4.7.1...
  • 批处理程序设计

    千次阅读 2010-09-04 13:12:00
    当然我们的这个版本的主要内容是介绍批处理在入侵一些实际运用,例如我们后面要提到的用批处理文件来给系统打补丁、批量植入后门程序等。下面就开始我们批处理学习之旅吧。    一.简单批处理内部
  • [HTML5&CSS3]应用程序缓存

    千次阅读 2014-11-21 09:46:06
    什么是应用程序缓存(Application Cache)?HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问。应用程序缓存为应用带来三个优势:离线浏览 - 用户可在应用离线时使用它们...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,399
精华内容 7,359
关键字:

下列程序中有错误的行是