调试_调试器 - CSDN
  • 如何调试代码

    2018-02-22 15:54:45
    近几日老哥在家指导着写了挺多代码,调试代码作为一个必经的过程也有了更深刻的了解。借这篇博客整理一下。(下文举例编程软件为VS) 调试bug最好用的是打断点。大一学习时并没有在意过断点的用法,每次调代码都是...

    近几日老哥在家指导着写了挺多代码,调试代码作为一个必经的过程也有了更深刻的了解。借这篇博客整理一下。(下文举例编程软件为VS)

    调试bug最好用的是打断点。大一学习时并没有在意过断点的用法,每次调代码都是直接正面刚,肉眼找错误,直到寒假才真正熟练掌握了断点的使用方法(捂脸)。在某处语句前打上断点,调试时便会在这里停止。下面举一个简单的例子:
    代码
    在第7行打上断点后,调试时程序会执行到while之前。一方面可以检测一下whlie语句之前是否有错误,另一方面可以通过逐步执行观察各个变量的数值变化。
    逐步执行
    下面可以显示出变量的监测窗口,方便实时对照
    变量
    逐步执行定位问题是很简单的一种途径。

    注释掉部分语句也是定位问题的一种方式。不过适用于整块函数。

    展开全文
  • VS调试技巧

    2018-08-25 17:16:06
    VS调试中经常使用断点、堆栈窗口,很少使用监视、快速监视窗口和即时命令窗口。查找了相关资料后发现监视窗口在某些情况下还是很有用的,所以针对上述窗口大体总结了一下; 1.添加监视变量 程序执行过程中命中断点...

    VS调试中经常使用断点、堆栈窗口,很少使用监视、快速监视窗口和即时命令窗口。查找了相关资料后发现监视窗口在某些情况下还是很有用的,所以针对上述窗口大体总结了一下;
    1.添加监视变量
    程序执行过程中命中断点后,
    a. 在变量名称位置单击右键,”添加监视”;
    b. 将变量选中,拖动 到监视窗口;
    c. 在监视列表中双击,编辑要监视的变量名称;
    2. 监视中查看、修改变量当前值
    a. 若监视的变量为数值,则可选择数值展示的进制格式:1) 单击右键,选择”以x进制展示”; 1) 通过”变量名称,格式字符”的方式切换展示方式,如下图。图中a变量的当前值为0xabc,”a,d”是以十进制方式展示;”a,x”是以十六进制小写展示。vs支持多种格式字符,详细说明见如下链接:
    https://msdn.microsoft.com/zh-cn/library/75w45ekt.aspx
    数值格式化显式
    b. 双击变量值,可做编辑修改,修改后的变量如图标红高亮显式。MSDN上对于标红高亮的解释如下:

    为什么在“局部变量”窗口和“自动”窗口中变量值有时是红色的?
    你可能注意到,在“局部变量”和“自动”窗口中一个变量的值有时是红色的。 这些是自上次评估以来更改过的变量值。 此更改可能是在上一次调试会话中进行的,或者是因为在窗口中更改了该值。

    3.计算表达式的值
    在监视窗口中可对当前作用域中的可见变量计算相关表达式的值:
    a. 变量加减或取址
    这里写图片描述
    b.函数或接口调用
    接口调用时,值这一列对应为函数调用的返回值,若无返回值则为void
    这里写图片描述
    c.查看地址对应的符号信息
    调试中需要查看某些地址位置对应的符号,可以添加到监视窗口,默认地址值以数值方式展示。若明确知道该地址为某一类型变量的地址,则可以将对地址做强制地址转换,输入如下表达式:(CSomeType*)0x000aefee。然后就可以看到该地址对应内存中的内容。若不知道其实际类型,可尝试使用”void*”做强制转换以明确告诉调试器,该值为内存地址值,调试器会尝试做符号解析。测试中发现void*强转仅对编译期生成的静态符号,如函数,静态变量等能够准确匹配,堆或栈上分配的数据变量无法匹配(静态变量定义后需要有访问、使用,否则编译器会将其优化掉,导致监视时找不到该变量)。如下图:
    这里写图片描述
    另外,对于监视窗口的使用,CodeProject有篇文章总结的很好,推荐读一下:

    https://www.codeproject.com/articles/121623/10-tips-you-should-know-about-watch-window-while-d

    展开全文
  • 手机打开调试模式的方法 尽量放在页面头部,底部有可能不行 <script src="https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></script> <script> // init vConsole var vConsole = new ...

    手机打开调试模式的方法
    尽量放在页面头部,底部有可能不行

    <script src="https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></script>
    <script>
      // init vConsole
      var vConsole = new VConsole();
      console.log('Hello world');
    </script>
     
    
    展开全文
  • 用GDB调试程序(一)

    2003-07-02 00:03:00
    用GDB调试程序GDB概述————GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比...

    用GDB调试程序

    GDB概述
    ————

    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。

    一般来说,GDB主要帮忙你完成下面四个方面的功能:

        1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
        2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
        3、当程序被停住时,可以检查此时你的程序中所发生的事。
        4、动态的改变你程序的执行环境。

    从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。


    一个调试示例
    ——————

    源程序:tst.c

         1 #include <stdio.h>
         2
         3 int func(int n)
         4 {
         5         int sum=0,i;
         6         for(i=0; i<n; i++)
         7         {
         8                 sum+=i;
         9         }
        10         return sum;
        11 }
        12
        13
        14 main()
        15 {
        16         int i;
        17         long result = 0;
        18         for(i=1; i<=100; i++)
        19         {
        20                 result += i;
        21         }
        22
        23        printf("result[1-100] = %d /n", result );
        24        printf("result[1-250] = %d /n", func(250) );
        25 }

    编译生成执行文件:(Linux下)
        hchen/test> cc -g tst.c -o tst

    使用GDB调试:

    hchen/test> gdb tst  <---------- 启动GDB
    GNU gdb 5.1.1
    Copyright 2002 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "i386-suse-linux"...
    (gdb) l     <-------------------- l命令相当于list,从第一行开始例出原码。
    1        #include <stdio.h>
    2
    3        int func(int n)
    4        {
    5                int sum=0,i;
    6                for(i=0; i<n; i++)
    7                {
    8                        sum+=i;
    9                }
    10               return sum;
    (gdb)       <-------------------- 直接回车表示,重复上一次命令
    11       }
    12
    13
    14       main()
    15       {
    16               int i;
    17               long result = 0;
    18               for(i=1; i<=100; i++)
    19               {
    20                       result += i;   
    (gdb) break 16    <-------------------- 设置断点,在源程序第16行处。
    Breakpoint 1 at 0x8048496: file tst.c, line 16.
    (gdb) break func  <-------------------- 设置断点,在函数func()入口处。
    Breakpoint 2 at 0x8048456: file tst.c, line 5.
    (gdb) info break  <-------------------- 查看断点信息。
    Num Type           Disp Enb Address    What
    1   breakpoint     keep y   0x08048496 in main at tst.c:16
    2   breakpoint     keep y   0x08048456 in func at tst.c:5
    (gdb) r           <--------------------- 运行程序,run命令简写
    Starting program: /home/hchen/test/tst

    Breakpoint 1, main () at tst.c:17    <---------- 在断点处停住。
    17               long result = 0;
    (gdb) n          <--------------------- 单条语句执行,next命令简写。
    18               for(i=1; i<=100; i++)
    (gdb) n
    20                       result += i;
    (gdb) n
    18               for(i=1; i<=100; i++)
    (gdb) n
    20                       result += i;
    (gdb) c          <--------------------- 继续运行程序,continue命令简写。
    Continuing.
    result[1-100] = 5050       <----------程序输出。

    Breakpoint 2, func (n=250) at tst.c:5
    5                int sum=0,i;
    (gdb) n
    6                for(i=1; i<=n; i++)
    (gdb) p i        <--------------------- 打印变量i的值,print命令简写。
    $1 = 134513808
    (gdb) n
    8                        sum+=i;
    (gdb) n
    6                for(i=1; i<=n; i++)
    (gdb) p sum
    $2 = 1
    (gdb) n
    8                        sum+=i;
    (gdb) p i
    $3 = 2
    (gdb) n
    6                for(i=1; i<=n; i++)
    (gdb) p sum
    $4 = 3
    (gdb) bt        <--------------------- 查看函数堆栈。
    #0  func (n=250) at tst.c:5
    #1  0x080484e4 in main () at tst.c:24
    #2  0x400409ed in __libc_start_main () from /lib/libc.so.6
    (gdb) finish    <--------------------- 退出函数。
    Run till exit from #0  func (n=250) at tst.c:5
    0x080484e4 in main () at tst.c:24
    24              printf("result[1-250] = %d /n", func(250) );
    Value returned is $6 = 31375
    (gdb) c     <--------------------- 继续运行。
    Continuing.
    result[1-250] = 31375    <----------程序输出。

    Program exited with code 027. <--------程序退出,调试结束。
    (gdb) q     <--------------------- 退出gdb。
    hchen/test>

    好了,有了以上的感性认识,还是让我们来系统地认识一下gdb吧。

     


    使用GDB
    ————

    一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:

        > cc -g hello.c -o hello
        > g++ -g hello.cpp -o hello

    如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。

    启动GDB的方法有以下几种:

        1、gdb <program>
           program也就是你的执行文件,一般在当然目录下。

        2、gdb <program> core
           用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

        3、gdb <program> <PID>
           如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

     

    GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:

        -symbols <file>
        -s <file>
        从指定文件中读取符号表。

        -se file
        从指定文件中读取符号表信息,并把他用在可执行文件中。

        -core <file>
        -c <file>
        调试时core dump的core文件。

        -directory <directory>
        -d <directory>
        加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。

    下一页->

    (版权所有,转载时请注明作者和出处) 

    展开全文
  • 近几年,浏览器厂商也纷纷推出自己的远程调试(RemoteDebugging)工具,比如Opera Mobile 可以借助其推出的跨设备跨平台桌面开发者工具Opera Dragonfly 实现远程调试,iOS Safari 可以开启Web检查器在 Mac OS X系统中...

    在智能手机还未普及时,移动设备的调试处处是alert的,这估计是最常用的办法了。以前很多时候为了预览页面在移动设备上的效果,需要先将页面上传到测试服务器,再将url输入到设备浏览器,或者使用第三方二维码扫码应用,通过移动设备访问打开浏览实际效果,每次换设备都要重复这些操作,页面多的话这些繁琐的事情就特别让人厌烦了。移动互联网的浪潮,伴随着智能硬件的兴起与移动设备的普及,让前端工程师这个职业变得更为专业,前端工程师要做的工作也越来越多,尤其是国内大大小小众多的手机厂商的兴起、手机型号的繁多,仅仅依靠Firebug与Chrome/Safari自带的debug工具已经远远难以满足需求了。繁琐重复性劳动占用了相当的时间,庆幸的是前端的自动化工具也越来越多。越来越多的便捷调试工具无非是前端工程师的一大福音。

     

    近几年,浏览器厂商也纷纷推出自己的远程调试(RemoteDebugging)工具,比如Opera Mobile 可以借助其推出的跨设备跨平台桌面开发者工具Opera Dragonfly 实现远程调试,iOS Safari 可以开启Web检查器在 Mac OS X系统中实现远程调试。Android 4+已上系统的 Chrome for Android可以 配合 ADB(Android Debug Bridge)实现桌面远程调试,桌面版Chrome 32+已经支持免安装ADB即可实现远程调试移动设备页面/WebView 。国内的UC浏览器开发者版也推出了自己的远程调试工具RemoteInspector(简称RI)。

     

    除了浏览器厂商之外,也涌现出许多第三方开发的远程调试工具,诸如支持全平台调试的Weinre 和Adobe Edge Inspect CC,国人自研的iOS专用工具MIHTool。

     

    本篇主要说一下Chrome RemoteDebugging 的方法,之前也遇到一些坑,自己总结了一些经验,分享如下。


    Chrome DevTools调试移动设备Brower Page Tabs/WebViews

     

    安卓远程调试目前支持所有操作系统(Windows,Mac, Linux, and Chrome OS.)中调试,支持

    ● 调试站点的页面

    ● 调试安卓原生App中的WebView

    ● 实时将安卓设备的屏幕图像同步显示到开发机器。

    ● 通过端口转发(port forwarding)与虚拟主机映射(virtual host mapping)实现安卓移动设备与开发服务器进行交互调试。

     

    调试要求:

    ● 开发环境安卓桌面版Chrome32+

    ● 一条USB数据线,连接电脑与移动设备,安装相应机型的USB驱动。驱动程序下载地址:http://developer.android.com/tools/extras/oem-usb.html

       如果电脑上安装有百度手机助手、360手机助手这类软件,一般连接后可以自动安装相应的USB驱动程序。

    ● 如果是调试网页,移动设备需要安装Chrome forAndroid ,且安卓系统须为Android 4.0+

    ● 对于APP WebView的调试,需要系统为Android 4.4+ 并且原生应用内的Webview须进行相应的调试声明配置。

    说明:远程调试要求桌面版Chrome浏览器版本要高于安卓移动设备的Chrome版本号。有条件的最好使用Chrome 的金丝雀特别版Chrome Canary (Mac/Windows)或者Chrome桌面开发版Chrome Dev channel release (Linux)。

     

    第一步:首先在移动设备上开启USB调试模式。方法:

    ● Android 3.2+,打开设置 – 应用程序 – 开发,在“USB调试”处打钩选上

    ● Android 4.0~ Android 4.1 ,打开设置-开发者选项-进入在“USB调试”处打钩选上。

    ● Android 4.2+,打开设置-关于手机-手机配置信息-连点“版本号”7次,返回上层就可以看到“开发者选项”显示出来了,在“USB调试”处打钩选上。


    第二步:用USB数据线连接设备,驱动装好连接成功后,你可能会在设备上看到一个弹框请求允许使用这台计算机通过usb调试

     

     

     

    勾选后点击“确定”。

    第三步:在电脑上打开Chrome浏览器的菜单– 更多工具 – 检查设备(Chromemenu > More tools > Inspect Devices),或者直接在浏览器地址栏输入chrome://inspect 或者about:inspect



    打开后DevTools后,确保打钩选中Discover USB devices

     

    如果USB连接成功,这时候我们可以看到移动设备的型号和设备上运行的页面和允许调试的WebView列表。找到需要调试的目标页面,点击inspect即可打开DevTools,点击reload可重新加载当前的调试页面,点击focus tab可将标签页置顶,close为关闭当前页面。更可以通过在输入框中键入网址新开一个页面。

     

    点击inspect打开DevTools后,你可以选中页面中的DOM元素,同时设备中对应元素也高亮显示,也可使用DevTools中的Inspect Element 选中目标元素,可以实时与移动设备页面交互,方便的定位问题所在,进行代码调试。

     

    在输入框中输入一个新的网址,点击Opoen可打开你想要调试的新页面。


    说明:由于Chrome版本不同,DevTools也可能有些差别,比如我的Chrome38.0.2125.104 m版竟然没有打开新页面的url输入框,升级到v39后恢复正常,知道原因的欢迎留言。

    1. DevTools窗口使用F5快捷键(CMD+R for Mac)重新加载页面

    2. 使用Network面板可以实时观察页面在手机实际网络环境中资源的加载情况。

    3. Timeline面板可以用来分析页面渲染和CPU使用情况,通常情况下移动设备的性能会比电脑上要低一些。

    4.  在DevTools的Console控制台中编写脚本执行,会同步表现在移动设备中检查的页面。

    5. 如果要调试本地搭建的服务器程序,需要用到端口转发和虚拟主机映射,以使设备上可以呈现你本地环境下的页面内容。

     

    调试WebView需要满足安卓系统版本为Android 4.4+已上。并且需要再你的APP内配置相应的代码,在WebView类中调用静态方法setWebContentsDebuggingEnabled,如下:

      if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.KITKAT) {
    
         WebView.setWebContentsDebuggingEnabled(true);
    
      }

    以上配置方法适用于安卓应用内所有的WebView情形。

    安卓WebView是否可调试并不取决于应用中manifest的标志变量debuggable,如果你想只在debuggable为true时候允许WebView远程调试,请使用以下代码段:

    if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) {
    
        if (0 != (getApplicationInfo().flags &=ApplicationInfo.FLAG_DEBUGGABLE))
    
        { WebView.setWebContentsDebuggingEnabled(true);}
    
      }


    WebView的可用列表如下:


    所列信息其中包括页面的title,url地址,页面尺寸大小及其相对于设备屏幕的相对位置。

     

    实时屏幕投影(Live screencasting)


    调试移动设备时视线在两个设备的屏幕之间来回切换太不方便了,screencast实现了移动设备屏幕与开发环境DevTools的同步,你可以通过screencast与移动设备上的内容进行交互式的操作。

     

    Screencast只呈现页面的内容,而不显示工具条地址栏、设备键盘等其他设备接口,这些在Screencase中表现为透明部分。

     

    Android 4.4,是由Google公司制作和研发的代号为KitKat的手机操作系统,于北京时间2013年9月4日凌晨对外公布了该Android新版本的名称,为Android 4.4(代号 KitKat 奇巧)。据悉,该代号来自雀巢的KitKat巧克力。对于KitKat 4.4.3,screencast不仅可以在Tab网页实现,在WebView上也可以同步交互操作。

     

    点击 DevTools右上角的Screencast图标,可以开启Screencast视图,移动设备屏幕会实时展现在左侧的Screencast面板中。



    Chrome32+版本的DevTools对连接的设备支持native USB debugging。而版本号稍低的一些则需要通过安装ADB或ADB plugin调试移动设备上的Chrome网页。由于之前一直是使用ADB plugin方式调试,如今一番折腾发现高版本更为方便实用的特性,由于网上的资料比较零散,关键的东西都没有提及,坑也不少,这也正是写此文的缘由。

     

    曾经靠安装Android SDK套件,需要执行类似 adb forward tcp:9001 localabstract:chrome_devtools_remote 这样的命令,才能开始调试,现在我们完可以摆脱这些繁琐的命令了。

    开发机器安装ADB plugin是Chrome 28+之后的方式,区别于以前需要安装整个Android SDK套件,同时移动设备要安装Chrome for Android 28+。ADB扩展程序安装成功后,Chrome菜单旁边会出现一个灰色的Andr​​oid启动图标。

    点击Android的图标,然后单击ADB开始。一旦ADB已经开始,菜单图标变成绿色,并显示当前连接的设备的数量,如果有连接设备的话。


    点击View inspection Targets打开:列表中会显示每个连接的设备及其选项卡页面。查找要调试的页面,并点击页面链接URL旁边的inspect启动DevTools调试窗口。 

     

    使用用DevTools特别重要的一点是:如果你点击inspect打开的DevTools窗口一片空白,且刷新无效时,那极有可能是由于被墙的缘故,你可以尝试appspot.com是否可以ping的通,如果无法ping通,那你现在就先翻墙吧(goagent 或红杏都不错,将appspot.com加入白名单),当然你还需要有google账户。

     

    补充说明一下,如果接上USB数据线后,没有显示任何连接的设备,请按照以下步骤排查:

    ● 检查您的设备连接到USB,检查USB数据线。

    ● 确保您的设备发出ADB设备命令列为可用。如果没有,检查是否有您的设备上是否启用USB调试。

    ● 若是Windows系统,检查你的USB驱动是否安装正确。参考http://developer.android.com/tools/extras/oem-usb.html

    ● 桌面Chrome浏览器打开 chrome://inspect检查Discover USB devices是否选中

    ● 确保桌面浏览器版本要高于移动设备的Chrome版本号

    ● 如果Chrome for Android版本较低,请检查移动设备上Chrome浏览器设置,确保设置中启用USB调试。高版本中无此设置项,无须设置。

    ● 如果依然无法显示,尝试重新拔插USB数据线。

     

     

    端口转发(Port forwarding)

     

    你的手机和开发机器有时会处于两个不同的网络(如本地服务器和线上服务器两个不同的网络环境),手机上可能获取不到开发环境的页面内容。况且,有时候你的开发环境处于公司出于安全原因管控限制下的网络中。

     

    Chrome For Android中的端口转发解决了这一困难,在手机上测试你开发的网站瞬间变得容易。它的工作原理是在移动设备上创建一个监听TCP端口,该端口映射到开发机器特定的TCP端口,两个端口通过USB线路通信,所以这种连接并不依赖于所处网络环境的配置。

     

    在进入正题前必须要提前说明搭建本地服务器需要注意的一些点。安装本地服务器,这里安装的是wamp集成包。一键安装完成后,需要修改Apache的一些设置。


    1. 打开Apache安装目录下的配置文件httpd.conf增加监听多个端口。


    # Listen: Allows you to bindApache to specific IP addresses and/or
    # ports, instead of the default. See also the <VirtualHost>
    # directive.
    #
    # Change this to Listen on specific IP addresses as shown below to
    # prevent Apache from glomming onto all bound IP addresses.
    #
    #Listen 12.34.56.78:80
    Listen 80
    Listen 8888
    
    Listen 8999
    Listen 1818
     

    开启Apache服务后可通过命令netstat –n –a查看所配置的端口是否开启。

    如果你本地环境也开启了IIS服务,为了避免二者都是用80端口发生冲突,可以按照上述方法修改Apache的默认端口。修改设置完成后别忘了重启Apache服务。

    如何改变IIS端口:若保留Apache服务与IIS服务同时运行,不想改变Apache默认80端口,那么只能改变IIS端口,方法如下:开始->运行->输入:inetmgr->Internet信息服务->本地计算机->网站->右键“默认网站”->属性->选择“网站”标签->修改TCP端口即可。最后重新启动IIS服务。

     

    2. 在httpd.conf文件中开启虚拟主机配置


    # Virtual hosts
    
    #Includeconf/extra/httpd-vhosts.conf

    将第二行前的#号去掉,即是为了允许加载扩展配置。

     

    1.  Apache服务器默认的路径为安装目录下的htdocs,如果想改变默认目录,可以修改httpd.conf文件下的DocumentRoot和Directory,修改两者路径到你指定的目录即可。

    #
    
    # DocumentRoot: The directoryout of which you will serve your
    
    # documents. By default, allrequests are taken from this directory, but
    
    # symbolic links and aliasesmay be used to point to other locations.
    
    #
    
    DocumentRoot "E:/wamp/www/"
    
     
    
    #
    
    # This should be changed towhatever you set DocumentRoot to.
    
    #
    
    <Directory "E:/wamp/www/">

    打开extra目录下的httpd-vhosts.conf配置文件,在文件最后位置分别为监听的端口设置虚拟主机目录


    #
    
    # Use name-based virtual hosting.
    
    #
    
    NameVirtualHost *:80
    
     
    
    #
    
    # VirtualHost example:
    
    # Almost any Apache directive may go into a VirtualHostcontainer.
    
    # The first VirtualHost section is used for all requests that donot
    
    # match a ServerName or ServerAlias in any <VirtualHost>block.
    
    #
    
    <VirtualHost *:80>
    
        ServerAdminwebmaster@dummy-host.example.com
    
        DocumentRoot "E:/wamp/www /dummy-host.example.com"
    
        ServerName dummy-host.example.com
    
        ServerAliaswww.dummy-host.example.com
    
        ErrorLog"logs/dummy-host.example.com-error.log"
    
        CustomLog"logs/dummy-host.example.com-access.log" common
    
    </VirtualHost>
    
     
    
    <VirtualHost *:80>
    
        ServerAdminwebmaster@dummy-host2.example.com
    
        DocumentRoot"E:/wamp/www"
    
        ServerName localhost
    
        ErrorLog"logs/dummy-host2.example.com-error.log"
    
        CustomLog"logs/dummy-host2.example.com-access.log" common
    
    </VirtualHost>
    
     
    
    <VirtualHost *:8888>
    
        ServerAdminprograms@dummy-host2.example.com
    
        DocumentRoot"E:/wamp/www/programs"
    
        ServerName localhost
    
        ErrorLog"logs/programs-host2.example.com-error.log"
    
        CustomLog"logs/programs-host2.example.com-access.log" common
    
    </VirtualHost>
    
     
    
    <VirtualHost *:8999>
    
        ServerAdminprograms@dummy-host2.example.com
    
        DocumentRoot"E:/wamp/www/site"
    
        ServerName localhost
    
        ErrorLog"logs/programs-host2.example.com-error.log"
    
        CustomLog"logs/programs-host2.example.com-access.log" common
    
    </VirtualHost>
    
     
    
    <VirtualHost *:1818>
    
        ServerAdmin webapp@dummy-host2.example.com
    
        DocumentRoot"E:/wamp/www/webapp"
    
        ServerName a.test.com
    
        ErrorLog"logs/webapp-host2.example.com-error.log"
    
        CustomLog"logs/webapp-host2.example.com-access.log" common
    
    </VirtualHost>


    其中a.test.com若要生效还需要在本地host文件中增加映射关系:127.0.0.1 a.test.com

    然后我们测试一下,在浏览器输入你配置的主机名和端口号,url指向你要打开的文件。



    若出现上述提示,检查你的虚拟主机目录是否正确。如果目录设置正确,即可打开页面。

     

    一般情况下目录访问权限默认为:

    #
    
    # First, we configure the"default" to be a very restrictive set of
    
    # features. 
    
    #
    
    <Directory />
    
        Options FollowSymLinks
    
        AllowOverride All
    
        Order deny,allow
    
        Deny from all
    
    </Directory>

    许多人为了方便直接设置为


    #
    
    # First, we configure the"default" to be a very restrictive set of
    
    # features. 
    
    #
    
    <Directory />
    
        Options FollowSymLinks
    
        AllowOverride All
    
        Order allow ,deny
    
        Allow from all
    
    </Directory>

    出于安全考虑,根据调试的人员和实际需要,我个人倾向于为特定目录设置不同的权限,示例如下:


    #
    
    # First, we configure the"default" to be a very restrictive set of
    
    # features. 
    
    #
    
    <Directory />
    
        Options FollowSymLinks
    
        AllowOverride All
    
        Order deny,allow
    
        Deny from all
    
    </Directory>
    
     
    
    <Directory "E:/wamp/www/webapp">
    
        Options FollowSymLinks
    
        AllowOverride All
    
        Order deny,allow
    
        Deny from all
    
        Allow from 192.8
    
    </Directory>
    
     
    
    <Directory "E:/wamp/www/programs">
    
        Options -Indexes FollowSymLinks
    
        AllowOverride All
    
        Order deny,allow
    
        Deny from all
    
        Allow from 192.8.102. 192.8.104. 192.8.22.
    
    </Directory>

    设置完成后重启Apache服务生效。

    安全是安全了,不过有一个问题,访问localhost下的页面会出现这样的情形:



    其实我们再增加一句 Allow from127.0.0.1 ::1 localhost 即可解决此问题。如下:


    <Directory "E:/wamp/www/programs">
    
        Options -Indexes FollowSymLinks
    
        AllowOverride All
    
        Order deny,allow
    
        Deny from all
    
        Allow from 192.8.102. 192.8.104. 192.8.22.
    
        Allow from 127.0.0.1 ::1 localhost
    
    </Directory>

    重启再试,页面正常显示出来了。如下图:


    现在搭建好了本地服务器,开启了若干监听端口,进入正题,接着说端口转发。


    要使用端口转发(Port forwarding)功能,需要满足以下条件:


    1.      在开发机器的Chrome浏览器打开chrome://inspect

    2.      点击PortForwarding,弹出设置窗口

     

    3.      在设备端口输入框,填写移动设备要监听的端口号(默认为8080)

    4.      在Host主机输入域,填写运行web应用的当前ip地址(或主机名称,如localhost)加端口号。IP地址可以填写开发机器可访问的任何本地地址。当前,端口号范围必须在1024~65535之间(包括)

    5.      选中Enableport forwarding.

    6.      点击Done完成。


    当chrome://inspect窗口的端口号闪动为绿色时,表明该端口转发配置已生效。此时你可以在移动设备上打开本地页面进行调试了。

    在Chrome29之前端口转发功能有限,如果遇到问题,请确保你的Chrome版本升级到29以上再使用。在Chrome31+端口转发已经不是试验性功能了,而是正式发布的功能了。

     

    前面我们已经搭建好本地服务器环境。接上USB线,打开chrome://inspect/#devices,根据Apache所设的监听端口,设置相应DevTools的端口转发参数,如下图:

     

     

    完成了端口转发的设置后,这时候我们就可以进行调试本地环境下的页面了。

    输入url,打开本地的页面。

    例如

    http://localhost:1818/taskmarket/index.html

    http://localhost:8888/christmas/index.html

     

    如下图所示:

     


    虚拟主机映射(Virtual hostmapping)

     

    当你在localhost域名(或你的本地开发机器IP)下调试,端口转发很灵验。不过,如果你要使用自己定制的本地域名来调试那就不管用了。

    如果你在使用一个仅能运行于特定白名单中的域名下的JavaScriptSDK,因此你在host文件中设置了如127.0.0.1 xxx.com这样的对应关系。或许你在Web服务器(MAMP,wamp,xampp等)用虚拟主机配置了个性的域名。

     

    若是想让移动设备显示特定域名下页面内容,你需要使用上述的端口转发技术和代理服务器技术来实现。代理服务器可以将移动设备上的请求映射到主机的正确位置。

     

    搭建代理

     

    目前有许多搭建代理服务器的工具,比如Mac上的Charles Proxy,在Windows系统下的Fiddler,Linux下的Squid cacheSquid作为一款开源的代理服务软件,也可以用作Web缓存服务器,实现高速的Web访问需求。主机上安装运行代理服务器,所有来自安卓移动设备的请求都将会转发到代理服务器。

     

    代理服务的搭建方法这里不细说看,感兴趣的可以参考我的文章或自行查找。

     

    端口转发代理设置的步骤:


    1.  安装代理服务软件,在主机上搭建代理服务器。

    2.  开启代理服务,并确保代理服务器运行的端口与Chrome端口转发所设端口不相同。

    3.  Chrome浏览器打开“检查设备”chrome://inspect

    4.  点击Port forwarding 弹出设置窗口。

    5.  设备端口处填上安卓设备要监听的端口,如9000。

    6.  主机IP处可以填写localhost:xxxx,比如localhost:9000,也可以填写我上面配置过的本地域名a.test.com:1818

    7.  勾选 Enableport forwarding

    8.  点击Done按钮完成参数配置。

     

    移动设备代理服务参数设置:

    1.  打开设置-WLAN(Settings> Wi-Fi

    2.  长按当前连接的无线网络(代理服务设置适用于每个无线网络)

    3.  点击修改网络(Modify network

    4.  勾选高级选项(Advanced options),将显示设置项:

     

    5.  点击“代理”(Proxy)菜单选择“手动”(Manual

    6.  在“代理服务器主机名”( Proxyhostname)处输入localhost或者127.0.0.1

    7.  在“代理服务器端口”(Proxy port)处输入端口号,如9000

    8.  点击保存(Save)。

    通过以上参数设置,移动设备上所有请求被转发到主机的代理服务器,代理服务器代表安卓移动设备来发送请求,使得发送到特定域名下的请求得到了合理的解析。现在你可以调试特定域名下的页面了。



     

    注意:为了不影响移动设备正常上网浏览,断开USB数据线后一定要恢复代理设置。

    Fiddler默认使用8888端口,我的本地服务器已经占用8888端口,所以在Fiddler-Tools菜单中将监听端口设为未使用的10000端口,如图:


    手机端代理设置参数完毕后,打开ChromeDevTools进行调试。点击inspect可以看到页面显示在手机浏览器了,现在开始调试吧。

    我的测试页面为http://a.test.com:1818/taskmarket/index.html


    DevTools实例的调试截图如下:

     

    手机端Chrome for Android中的实时截图如下:

     

    注意主机要和移动设备处在同一网段的局域网内。

    有问题的童鞋可以留言或查看我博客的其他相关文章。 Chrome远程调试部分就到这里了。移动端的调试还没有结束,下一节我会介绍Weinre远程调试的技巧和详细教程。

    转载请注明出处:  freshlover的CSDN专栏文章《移动端Web开发调试之Chrome远程调试(Remote Debugging)》http://blog.csdn.net/freshlover/article/details/42528643

    参考文章:Remote Debugging on Androidwith Chrome https://developer.chrome.com/devtools/docs/remote-debugging


    展开全文
  • C语言调试

    2016-05-10 07:33:40
    1.调试的概念以及调试器的选择 在编写代码的过程中,相信大家肯定遇到过这样的情况:代码能够编译通过,没有语法错误,但是运行结果却不对,反复检查了很多遍,依然不知道哪里出了问题。这个时候,就需要调试程序了...
  • 设置在Release模式下调试的方法: 1.工程项目上右键 -> 属性 2.c++ -> 常规 -〉调试信息格式 选 程序数据库(/Zi)或(/ZI), 注意:如果是库的话,只能(Zi) ...4.连接器 -〉调试 -〉生成调试信息 选 是 (/DEBUG)
  • 调试在程序编程中起到很重要的地位,调试可以帮助程序员解决很多问题。但是在编写程序前,要对需要编写的程序有自己的思路,何时需要有用的变量以及常量,这都是需要思考的。...
  • 调试(Debug)   软件调试是在进行了成功的测试之后才开始的工作,它与软件测试不同,调试的任务是进一步诊断和改正程序中潜在的错误。   注: 以问题为中心 以错误为导向   调试活动由两部分组成: u ...
  • 1.为什么要进行程序调试调试程序的目的? 程序调试是将编制的程序投入实际运行前,用手工或 编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。 测试时程序...
  • 详解反调试技术

    2017-02-04 16:30:10
    调试技术,恶意代码用它识别是否被调试,或者让调试器失效。恶意代码编写者意识到分析人员经常使用调试器来观察恶意代码的操作,因此他们使用反调试技术尽可能地延长恶意代码的分析时间。为了阻止调试器的分析,当...
  • web项目调试

    2018-08-15 15:43:33
    web项目往往由前端和后台组成,涉及的内容和知识特别多,初学者由于对其运行机制理解不到位,同时没有掌握恰当的调试方法,当项目出现问题时就比较茫然、无从下手。提高调试能力对于程序员来讲是至关重要,是成为一...
  • PyCharm 作为IDE,断点调试是必须有的功能。否则,我们还真不如用纯编辑器写的快。 【运行】和【调试】前的设置,详见前面的文章,helloword。 1,设置断点 在代码前面,行号的后面,鼠标单击,就可以设置...
  • 将程序发布到自己本机IIS里,我们进行内部测试,难免会出现bug,可以通过vs进行调试。 步骤:“调试”》=“附加到进程”,如下界面: 找到进程名称为w3wp.exe,如果没有显示,则勾选显示所有用户的进程即可,会有多...
  • (1)发现断点debug调试无效,很郁闷,网上搜索解决办法。 看到的都是一些很复杂的方案,说是远程调试,还要另外开端口号。这和传统的项目不一样,因此觉得没必要。 所以经过摸索,发现有一种更加简单的方式,步骤...
  • 目前有许多免费的串口调试工具,比较常用的有:1、友善串口调试助手(v2.6.5)优点: 1)使用方便,不丢包; 2)串口自动识别,支持COM9以上串口; 3)支持多串口调试; 4)支持历史发送记录; 5)广泛支持各种...
  • 程序的调试过程主要有:单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量。 本文将主要介绍linux下的强大调试工具是怎么完成这些工作的。之所以要调试程序,是因为程序的运行结果和预期结果不一致,...
  • 在 linux 系统下进行串口调试或者开发时配合简单易用的串口调试工具那是必不可少。这篇博客对当前用的较多的,且我自己经常用的一些串口工具做一下汇总,大家可以参考一下。 实验环境: OS: Ubuntu16.04 Kernel: ...
  • 微软新出了一个代码编辑器,叫做Visual Studio Code,VS Code只能编辑代码,没有调试等命令,使用惯了编译器,会发现VS Code有点儿无从下手。 VS Code打开如图所示: 调试方式一般有两种: 第一种:可以...
  • 内存泄露调试

    2015-08-01 17:33:08
    内存泄露调试(Memory Leak Debug) 一、概述内存泄露产生原因存在多种,但常见分类如下: 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 2.偶发性内存泄漏。...
1 2 3 4 5 ... 20
收藏数 1,497,625
精华内容 599,050
关键字:

调试