精华内容
下载资源
问答
  • 从系统调试的角度描述了RTEMS的结构,简要介绍了GDB远程调试模式和传统的STUB调试技术,最后提出了使用GDB完成RTEMS任务级别调试调试系统框架。
  • 论文首先阐述了交叉编译和交叉调试的概念,简要说明了嵌入式软件的开发过程,介绍了系统级调试和任务级调试的概念,比较了它们之间的区别;接着对GCC编译器主要组成部分进行了详细的分析;随即对交叉调试的核,fi,...
  • Windows高级调试

    2011-03-03 11:20:33
    本书直面软件工程中的最困难任务——侦错  围绕软件世界中的最强大工具——调试器  全方位展示了软件调试技术的无比威力和无穷魅力  80个示例程序的源程序文件和项目文件
  • NET高级调试_.net_源码

    2021-10-03 11:11:31
    内容简介:《.NET高级调试...本书内容主要包括:调试工具简介、CLR基础、基本调试任务、程序集加载器、托管堆与垃圾收集、同步、互用性以及一些高级主题,如事后调试、一些功能强大的调试工具和.NET 4.0中的新功能等。
  • 基于FreeRTOS多任务程序实现及串口窗口调试 文章目录基于FreeRTOS多任务程序实现及串口窗口调试一、利用FreeRTOS程序完成多任务功能1. 创建FreeRTOS内核环境2. FreeRTOS程序实现二、运用串口助手进行窗口调试总结 ...

    基于FreeRTOS多任务程序实现及串口窗口调试

    FreeRTOS是一个迷你的实时操作系统内核.。作为一个轻量级的操作系统,功能包括:.任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。
    由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是.完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,在嵌入式领域中,嵌入式实时操作系统正得到越来越广泛的应用。采用嵌入式实时操作系统(RTOS)可以更合理、更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性。

    一、利用FreeRTOS程序完成多任务功能

    本过程主要执行完成三个周期性task

    1. 每间隔500ms闪烁(变化)一次LED;
    2. 每间隔2000ms,向串口发送一次指令数据“helloworld!";
    3. 每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)

    1. 创建FreeRTOS内核环境

    1. 创建FreeRTOS工程
      这里创建工程需要用到我们的KEIL5,会发现利用KEIL建立FreeRTOS时,需要确保自己的keil中有Cortex-M3(Cortex-M4 或 Cortex-M7)内核的处理器,调试方式选择软件仿真。
      注:没有上面提到的内核没有关系,这里有现成的工程模板,具体的模板可以参考野火的产品,它的资源和代码都是开源的,本例介绍的就是直接使用的模板
      野火相关资源,可以根据自身所用的开发板类型进行选择。
    2. FreeRTOS移植进入开发板
      再将FreeRTOS移植进入开发板中(本例选择的STM32开发板),其实主要的思想就是需要换一下启动文件,和添加BSP驱动就行了。

    2. FreeRTOS程序实现

    1. 主程序代码
    /* FreeRTOS头文件 */
    #include "FreeRTOS.h"
    #include "task.h"
    /* 开发板硬件BSP头文件 */
    #include "bsp_led.h"
    #include "bsp_usart.h"
    
    /****************************任务句柄********************************/
     /* 创建任务句柄 */
    static TaskHandle_t AppTaskCreate_Handle = NULL;
    /* LED1任务句柄 */
    static TaskHandle_t LED1_Task_Handle = NULL;
    /* LED2任务句柄 */
    static TaskHandle_t AHT20_Task_Handle = NULL;
    
    static TaskHandle_t Usart_Task_Handle = NULL;
    
    /*
    *************************************************************************
    *                             函数声明
    *************************************************************************
    */
    static void AppTaskCreate(void);/* 用于创建多任务 */
    
    static void LED1_Task(void* pvParameters);/* LED1_Task 任务实现*/
    static void AHT20_Task(void* pvParameters);/* AHT20_Task任务实现 */
    static void Usart_Task(void* pvParameters);/* Usart_Task任务实现*/
    	
    static void BSP_Init(void);/* 用于初始化板载资源 */
    
    int main(void)
    {	
      BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
    
      /* 开发硬件初始化 */
      BSP_Init();
    	
      //printf("FreeRTOS-动态创建多任务!\r\n");
    
    
       /* 创建AppTaskCreate任务 */
      xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,
                            (const char*    )"AppTaskCreate",
                            (uint16_t       )512, 
                            (void*          )NULL,
                            (UBaseType_t    )1, 
                            (TaskHandle_t*  )&AppTaskCreate_Handle);
      /*启动任务调度*/           
      if(pdPASS == xReturn)
        vTaskStartScheduler();   
      else
        return -1;  
      
      while(1);   
      }
    static void AppTaskCreate(void)
    {
      BaseType_t xReturn = pdPASS;
      taskENTER_CRITICAL();           
    
      /* 创建LED_TASK任务 */
      xReturn = xTaskCreate((TaskFunction_t )LED1_Task, 
                            (const char*    )"LED1_Task",
                            (uint16_t       )512,   
                            (void*          )NULL,	
                            (UBaseType_t    )2,	    
                            (TaskHandle_t*  )&LED1_Task_Handle);
      if(pdPASS == xReturn);
    	/* 创建AHT20_TASK */
      xReturn = xTaskCreate((TaskFunction_t )AHT20_Task, 
                            (const char*    )"AHT20_Task",
                            (uint16_t       )512,   
                            (void*          )NULL,	
                            (UBaseType_t    )3,	    
                            (TaskHandle_t*  )&AHT20_Task_Handle);
      if(pdPASS == xReturn);
    	/* 创建USART_TASK */
      xReturn = xTaskCreate((TaskFunction_t )Usart_Task, 
                            (const char*    )"Usart",
                            (uint16_t       )512,   
                            (void*          )NULL,	
                            (UBaseType_t    )4,	    
                            (TaskHandle_t*  )&Usart_Task_Handle);
      if(pdPASS == xReturn);
      vTaskDelete(AppTaskCreate_Handle); 
      taskEXIT_CRITICAL();           
    }
    static void LED1_Task(void* parameter)
    {	
        while (1)
        {
            LED1_ON;
            vTaskDelay(500);   
             LED1_OFF;
            vTaskDelay(500);   	 
        }
    }
    
    static void Usart_Task(void* parameter)
    {	
        while (1)
        {   vTaskDelay(2000);
            Usart_SendString( DEBUG_USARTx," helloworld!\n\n");   
        }	
    }
    
    static void AHT20_Task(void* parameter)
    {	
        while (1)
        {
            LED2_ON;
            vTaskDelay(5000);  
            LED2_OFF;     
            vTaskDelay(5000);   	   
        }	
    }
    static void BSP_Init(void)
    {
    	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
    	LED_GPIO_Config();
    	USART_Config();		
    }
    

    从代码中我们可以看到,我们创建了三个任务LED灯闪烁,字符串的发送,以及AHT20模块的实现。其中我们利用之前的模板进行修改,添加了一个用于发送的库。
    在这里插入图片描述

    二、运用串口助手进行窗口调试

    1. 将程序烧录到开发板中
      首先需要进行相关的串口配置,这一部分已经在上一个博客中介绍了如何配置。
      然后则需要利用串口将程序下载到开发板内下载成功后就进行下一步。
      在这里插入图片描述

    2. 运行串口助手进行窗口调试
      打开串口助手,配置端口
      在这里插入图片描述
      在这里插入图片描述
      如图,我们已经看到通过窗口调试,FreeRTOS的三个任务已经完成

    总结

    本次学习了FreeRTOS多程序的编写实现,在整个过程中主要是代码需要进行完善,以及一些库的添加还有启动文件的变换,这次学习了解了FreeRTO的用法,很不错。

    展开全文
  • 致 Python 初学者

    万次阅读 多人点赞 2019-11-10 00:03:26
    手工调试代码的手段不多,除了 print 信息,几乎只有把调试信息写成调试文件了。听起来,好像问题很严重,其实只是理念和取向不同而已。反过来想,手段单一,不恰好意味着简单、简明吗?十几年来,我一直使用 print...
    展开全文
  • 目录 一、Celery 对象解析 二、创建异步任务的方法 task 三、调用异步任务的三种方法 四、获取任务结果和状态 五、Celery 使用案例 一、Celery 对象解析 我们先来看一下 Celery 的初始化方法: class Celery(object)...

    一、Celery 对象解析

    • 我们先来看一下 Celery 的初始化方法:

      class Celery(object):
          def __init__(self, main=None, loader=None, backend=None,
                       amqp=None, events=None, log=None, control=None,
                       set_as_current=True, accept_magic_kwargs=False,
                       tasks=None, broker=None, include=None, changes=None,
                       config_source=None, fixups=None, task_cls=None,
                       autofinalize=True, **kwargs):
      
    • 常用的需要配置的参数:
      这些参数都是 celery 实例化的配置,我们也可以不写,可以使用config_from_object方法加载配置;

      main    : 如果作为__main__运行,则为主模块的名称。用作自动生成的任务名称的前缀
      loader  : 当前加载器实例。
      backend : 任务结果url;
      amqp    : AMQP对象或类名,一般不管;
      log     : 日志对象或类名;
      set_as_current : 将本实例设为全局当前应用
      tasks   : 任务注册表。
      broker  : 使用的默认代理的URL,任务队列;
      include : 每个worker应该导入的模块列表,以实例创建的模块的目录作为起始路径;
      

    二、创建异步任务的方法 task

    任何被 task 修饰的方法都会被创建一个 Task 对象,变成一个可序列化并发送到远程服务器的任务;它有多种修饰方式:

    • 方式一:使用默认的参数

      @celery.task
      def function_name():
          pass
      
    • 方式二:指定相关参数

      @celery.task(bind=True, name='name')
      def function_name():
          pass
      
      # task方法参数
      name       : 可以显式指定任务的名字;默认是模块的命名空间中本函数的名字。
      serializer : 指定本任务的序列化的方法;
      bind       : 一个bool值,设置是否绑定一个task的实例,如果绑定,task实例会作为参数传递到任务方法中,可以访问task实例的所有的属性,即前面反序列化中那些属性
      base       : 定义任务的基类,可以以此来定义回调函数,默认是Task类,我们也可以定义自己的Task类
      default_retry_delay : 设置该任务重试的延迟时间,当任务执行失败后,会自动重试,单位是秒,默认3分钟;
      autoretry_for       : 设置在特定异常时重试任务,默认False即不重试;
      retry_backoff       : 默认False,设置重试时的延迟时间间隔策略;
      retry_backoff_max   : 设置最大延迟重试时间,默认10分钟,如果失败则不再重试;
      retry_jitter        : 默认True,即引入抖动,避免重试任务集中执行;
      
      
      # 当bind=True时,add函数第一个参数是self,指的是task实例
      @task(bind=True)  # 第一个参数是self,使用self.request访问相关的属性
      def add(self, x, y):
          try:
              logger.info(self.request.id)
          except:
              self.retry() # 当任务失败则进行重试,也可以通过max_retries属性来指定最大重试次数
      
      
    • 方式三:自定义Task基类

      import celery
      
      class MyTask(celery.Task):
          # 任务失败时执行
          def on_failure(self, exc, task_id, args, kwargs, einfo):
              print('{0!r} failed: {1!r}'.format(task_id, exc))
          # 任务成功时执行
          def on_success(self, retval, task_id, args, kwargs):
              pass
          # 任务重试时执行
          def on_retry(self, exc, task_id, args, kwargs, einfo):
              pass
      
      @task(base=MyTask)
      def add(x, y):
          raise KeyError()
      
      # 方法相关的参数
      exc     : 失败时的错误的类型;
      task_id : 任务的id;
      args    : 任务函数的参数;
      kwargs  : 键值对参数;
      einfo   : 失败或重试时的异常详细信息;
      retval  : 任务成功执行的返回值;
      
    • Task的常用属性

      Task.name     : 任务名称;
      Task.request  : 当前任务的信息;
      Task.max_retries   : 设置重试的最大次数
      Task.throws        : 预期错误类的可选元组,不应被视为实际错误,而是结果失败;
      Task.rate_limit    : 设置此任务类型的速率限制
      Task.time_limit    : 此任务的硬限时(以秒为单位)。
      Task.ignore_result : 不存储任务状态。默认False;
      Task.store_errors_even_if_ignored : 如果True,即使任务配置为忽略结果,也会存储错误。
      Task.serializer    : 标识要使用的默认序列化方法的字符串。
      Task.compression   : 标识要使用的默认压缩方案的字符串。默认为task_compression设置。
      Task.backend       : 指定该任务的结果存储后端用于此任务。
      Task.acks_late     : 如果设置True为此任务的消息将在任务执行后确认 ,而不是在执行任务之前(默认行为),即默认任务执行之前就会发送确认;
      Task.track_started : 如果True任务在工作人员执行任务时将其状态报告为“已启动”。默认是False

    三、调用异步任务的三种方法

    • 调用异步任务的三个方法分别是:

      # 方法一:这是apply_async方法的别名,但接受的参数较为简单;
      task.delay()
      # 方法二:可以接受复杂的参数
      task.apply_async(args=[arg1, arg2], kwargs={key:value, key:value})
      # 方法三:可以发送未被注册的异步任务,即没有被celery.task装饰的任务;
      send_task()		
      
    • 方法一:app.send_task
      注意: send_task 在发送的时候是不会检查 tasks.add 函数是否存在的,即使为空也会发送成功,所以 celery 执行是可能找不到该函数报错;

      # File_name:tasks.py
      from celery import Celery
      
      app = Celery()
      
      def add(x, y):
          return x+y
      
      app.send_task('tasks.add',args=[3,4])  # 参数基本和apply_async函数一样
      
      
    • 方法二:Task.delay
      delay 方法是 apply_async 方法的简化版,不支持执行选项,只能传递任务的参数。

      from celery import Celery
      
      app = Celery()
      
      @app.task
      def add(x, y, z=0):
      
          return x + y
      
      add.delay(30, 40, z=5)	# 包括位置参数和关键字参数
      
      
    • 方法三:Task.apply_async
      apply_async 支持执行选项,它会覆盖全局的默认参数和定义该任务时指定的执行选项,本质上还是调用了 send_task 方法;

      from celery import Celery
      	
      app = Celery()
      
      @app.task
      def add(x, y, z=0):
      
          return x + y
          
      add.apply_async(args=[30,40], kwargs={'z':5})
      
      # 其他参数
      task_id   : 为任务分配唯一id,默认是uuid;
      countdown : 设置该任务等待一段时间再执行,单位为s;
      eta       : 定义任务的开始时间;eta=time.time()+10;
      expires   : 设置任务时间,任务在过期时间后还没有执行则被丢弃;
      retry     : 如果任务失败后, 是否重试;使用true或false,默认为true
      shadow    : 重新指定任务的名字str,覆盖其在日志中使用的任务名称;
      retry_policy : {},重试策略.如下:
      ----max_retries    : 最大重试次数, 默认为 3.
      ----interval_start : 重试等待的时间间隔秒数, 默认为 0 , 表示直接重试不等待.
      ----interval_step  : 每次重试让重试间隔增加的秒数, 可以是数字或浮点数, 默认为 0.2
      ----interval_max   : 重试间隔最大的秒数, 即 通过 interval_step 增大到多少秒之后, 就不在增加了, 可以是数字或者浮点数, 默认为 0.2 .
      
      routing_key : 自定义路由键;
      queue       : 指定发送到哪个队列;
      exchange    : 指定发送到哪个交换机;
      priority    : 任务队列的优先级,0255之间,对于rabbitmq来说0是最高优先级;
      serializer  :任务序列化方法;通常不设置;
      compression : 压缩方案,通常有zlib, bzip2
      headers     : 为任务添加额外的消息;
      link        : 任务成功执行后的回调方法;是一个signature对象;可以用作关联任务;
      link_error  : 任务失败后的回调方法,是一个signature对象;
      
      # 其他参数参考用法如下:
      add.apply_async((2, 2), retry=True, retry_policy={
          'max_retries': 3,
          'interval_start': 0,
          'interval_step': 0.2,
          'interval_max': 0.2,
      })
      
    • 自定义发布者、交换机、路由键、队列、优先级、序列方案和压缩方法:

      task.apply_async((2,2), 
          compression='zlib',
          serialize='json',
          queue='priority.high',
          routing_key='web.add',
          priority=0,
          exchange='web_exchange')
      

    四、获取任务结果和状态

    由于 celery 发送的都是去其他进程执行的任务,如果需要在客户端监控任务的状态,有如下方法:

    r = task.apply_async()
    r.ready()     # 查看任务状态,返回布尔值,  任务执行完成, 返回 True, 否则返回 False.
    r.wait()      # 会阻塞等待任务完成, 返回任务执行结果,很少使用;
    r.get(timeout=1)       # 获取任务执行结果,可以设置等待时间,如果超时但任务未完成返回None;
    r.result      # 任务执行结果,未完成返回None;
    r.state       # PENDING, START, SUCCESS,任务当前的状态
    r.status      # PENDING, START, SUCCESS,任务当前的状态
    r.successful  # 任务成功返回true
    r.traceback  # 如果任务抛出了一个异常,可以获取原始的回溯信息
    

    但是一般业务中很少用到,因为获取任务执行的结果需要阻塞,celery使用场景一般是不关心结果的。

    五、Celery 使用案例

    # seting.py
    # 设置配置
    BROKER_URL =  'amqp://username:password@localhost:5672/yourvhost'
    CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
    CELERY_TASK_SERIALIZER = 'msgpack'
    CELERY_RESULT_SERIALIZER = 'msgpack'
    CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24
    CELERY_ACCEPT_CONTENT = ["msgpack"]
    CELERY_DEFAULT_QUEUE = "default"   
    CELERY_QUEUES = {
        "default": { # 这是上面指定的默认队列
            "exchange": "default",
            "exchange_type": "direct",
            "routing_key": "default"
        }
    }
    
    # app.py --- 初始化celery对象 
    from celery import Celery
    import seting
    from task import test_one, test_two
    
    celery = Celery(__name__, include=["task"]) # 设置需要导入的模块
    # 引入配置文件
    celery.config_from_object(seting)
    
    if __name__ == '__main__':
        test_one.apply_async((2,2), 
            routing_key='default',
            priority=0,
            exchange='default')
    
    # task.py  --- 定义需要执行的任务
    from app import celery
    
    @celery.task
    def test_one(x, y):
        return x + y
    
    @celery.task(name="one_name")
    def test_two(x, y):
        return x * y
    
    展开全文
  •  《.NET高级调试》内容主要包括:调试工具简介、CLR基础、基本调试任务、程序集加载器、托管堆与垃圾收集、同步、互用性以及一些高级主题,如事后调试、一些功能强大的调试工具和.NET 4.0中的新功能等。...

    .NET高级调试

     

    下载地址:http://pan.baidu.com/share/link?shareid=1028907117&uk=721744522

     

    内容简介

        《.NET高级调试》内容主要包括:调试工具简介、CLR基础、基本调试任务、程序集加载器、托管堆与垃圾收集、同步、互用性以及一些高级主题,如事后调试、一些功能强大的调试工具和.NET 4.0中的新功能等。这是一本介绍如何通过非托管调试器(包括WinDBG、NTSD和CDB等)来调试.NET。应用程序的书籍。《.NET高级调试》内容翔实、条理清晰,适合软件开发人员、软件测试人员、质量保证人员和产品技术支持人员等参考。
     

    作者简介

        Mario Hewardt,是微软公司的一位资深开发经理,在WirIdows系统级开发领域拥有十余年的开发经验。他目前领导开发团队负责Microosoft在线IT管理解决方案的开发。Hewardt是《Windows高级调试》(机械工业出版社2009年5月出版)的作者之一。
     

    目录

    对本书的赞誉
    译者序

    前言
    关于作者
    第一部分 简介
    第1章 调试工具简介
    1.1 Windows调试工具集
    1.2.NET 2.0可再发行组件
    1.3.NET 2.0 SDK
    1.4 SOS
    1.5 SOSEX
    1.6 CLR分析器
    1.7 性能计数器
    1.8 .NET反编译器
    1.9 PowerDbg
    1.1 0托管调试助手
    1.1 1小结

    第2章 CLR基础
    2.1 高层概览
    2.2 CLR和Windows加载器
    2.2.1 加载非托管映像
    2.2.2 加载.NET。程序集
    2.3 应用程序域
    2.3.1 系统应用程序域
    2.3.2 共享应用程序域
    2.3.3 默认应用程序域
    2.4 程序集简介
    2.5 程序集清单
    2.6 类型元数据
    2.6.1 同步块表
    2.6.2 类型句柄
    2.6.3 方法描述符
    2.6.4 模块
    2.6.5 元数据标记
    2.6.6 EEClss
    2.7 小结

    第3章 基本调试任务
    3.1 调试器以及调试目标
    3.2 符号
    3.3 控制调试目标的执行
    3.3.1 中断执行
    3.3.2 恢复执行
    3.3.3 单步调试代码
    3.3.4 退出调试会话
    3.4 加载托管代码调试的扩展命令
    3.4.1 加载SOS调试器扩展
    3.4.2 加载SOSEX调试器扩展
    3.5 控制CLR的调试
    3.6 设置断点
    3.6.1 在JIT编译生成的函数上设置断点
    3.6.2 在还没有被JIT编译的函数上设置断点
    3.6.3 在预编译的程序集中设置断点
    3.6.4 在泛型方法上设置断点
    3.7 对象检查
    3.7.1 内存转储
    3.7.2 值类型的转储
    3.7.3 转储基本的引用类型
    3.7.4 数组的转储
    3.7.5 栈上对象的转储
    3.7.6 找出对象的大小
    3.7.7 异常的转储
    3.8 线程的操作
    3.8.1 ClrStack
    3.8.2 Threads
    3.8.3 DumpStack
    3.8.4 EEStack
    3.8.5 COMState
    3.9 代码审查
    3.9.1 反汇编代码
    3.9.2 从代码地址上获得方法描述符
    3.9.3 显示中间语言指令
    3.10 CLR内部命令
    3.10.1 获得CLR的版本
    3.10.2 根据名字找到方法描述符
    3.10.3 对象同步块的转储
    3.10.4 对象方法表的转储
    3.10.5 托管堆和垃圾收集器信息的转储
    3.11 诊断命令
    3.11.1 找出对象的应用程序域
    3.11.2 进程信息
    3.12 SOSEX扩展命令
    3.12.1 扩展的断点支持
    3.12.2 托管元数据
    3.12.3 栈回溯
    3.12.4 对象检查
    3.12.5 自动死锁检测
    3.12.6 托管堆与垃圾收集命令
    3.13崩溃转储文件
    3.14小结

    第二部分 调试实践
    第4章 程序集加载器
    4.1 CLR加载器简介
    4.1.1 程序集标识
    4.1.2 全局程序集缓存
    4.1.3 默认加载上下文
    4.1.4 指定加载上下文
    4.1.5 无加载上下文
    4.2 简单的程序集加载故障
    4.3 加载上下文故障
    4.4 互用性与DllNot Found Exception
    4.5 轻量级代码生成的调试
    4.6 小结

    第5章 托管堆与垃圾收集
    5.1 Windows内存架构简介
    5.2 垃圾收集器的内部工作机制
    5.2.1 代
    5.2.2 根对象
    5.2.3 终结操作
    5.2.4 回收GC内存
    5.2.5 大对象堆
    5.2.6 固定
    5.2.7 垃圾收集模式
    5.3 调试托管堆的破坏问题
    5.4 调试托管堆的碎片问题
    5.5 小结

    第6章 同步
    6.1 同步的基础知识
    6.2 线程同步原语
    6.2.1 事件
    6.2.2 互斥体
    6.2.3 信号量
    6.2.4 监视器
    6.2.5 读写锁
    6.2.6 线程池
    6.3 同步的内部细节
    6.3.1 对象头
    6.3.2 同步块
    6.3.3 瘦锁
    6.4 同步任务
    6.4.1 死锁
    6.4.2 孤立锁异常
    6.4.3 线程中止
    6.4.4 终结器挂起
    6.5 小结

    第7章 互用性
    7.1 平台调用
    7.2 COM
    7.3 P/Invoke调用的调试
    7.3.1 调用约定
    7.3.2 委托
    7.4 互操作中内存泄漏问题的调试
    7.5 COM互用性中终结操作的调试
    7.6 小结

    第三部分 高级主题
    第8章 事后调试
    8.1 转储文件基本知识
    8.1.1 通过调试器来生成转储文件
    8.1.2 通过ADPIus生成转储文件
    8.1.3 转储文件的调试
    8.1.4 数据访问层
    8.1.5 转储文件分析:未处理的NET异常
    8.2 Windows错误报告
    8.3 小结

    第9章 一些功能强大的调试工具
    9.1 PowerDbg
    9.1.1 安装PowerDbg
    9.1.2 Analyze-PowerDbgllareads
    9.1.3 Send-PowerDbgCommand
    9.1.4 扩展PowerDbg的功能
    9.2 Visual Studio
    9.2.1 SOS的集成
    9.2.2.NET框架源代码级调试
    9.2.3 VisualStudio2010
    9.3 CLR分析器
    9.3.1 运行CLR分析器
    9.3.2 Summary视图
    9.3.3 Histogram视图
    9.3.4 Graph视图
    9.4 WinDbg和CmdTme命令
    9.5 小结

    第10章 CLR4.0
    10.1 工具
    10.1.1 Windows调试工具集
    10.1.2.NET4.0可再发行组件
    10.1.3 SOS
    10.2 托管堆与垃圾收集
    10.2.1 扩展的诊断信息
    10.2.2 后台垃圾收集
    10.3 同步
    10.3.1 线程池与任务
    10.3.2 监视器
    10.3.3 栅栏
    10.3.4 CountdownEvent
    10.3.5 ManualResetEventSlim
    10.3.6 SemaphoreSlim
    10.3.7 SpinWait和Spin10ck
    10.4 互用性
    10.5 事后调试
    10.6 小结
     

    前言

        去年,我们在微软公司庆祝了CLR发布十周年。CLR的目的是通过提供一种安全的和稳定的环境来提高开发人员的生产效率。目前,CLR在各种环境中都得到了广泛应用,例如,在性能和可伸缩性上有着极高要求的大型服务器程序,以及日常使用的桌面程序等。随着CLR的日益普及,基于CLR来开发软件的人们同样面临着越来越多的挑战,因为他们的产品必须能够在不同的机器配置和网络环境中运行;此外,随着硬件的高速发展,人们正在构建的软件功能越来越强,同时复杂性也越来越高。所有这些情形都意味着,当程序没有按照预期方式运行时,你就需要负责分析和修复程序中的问题,因此了解一些调试知识和工具就显得尤为重要。
        为了提高工作效率,CLR为开发人员实现了许多基础的辅助机制,从而使开发人员能将主要精力放在关键逻辑上。事实上,人们无需花太多的时间来理解完整的CLR内部细节,而只需知道一些有助于分析问题的重要概念,这一点非常重要。然而,要想知道哪些概念是重要的却并不容易。许多人都是通过反复摸索之后才掌握这些知识,而这需要长时间的积累过程并且有时候可能得不到准确的答案。
        本书对运行时的阐述恰到好处,它能帮助你理解在分析问题时遵循的思考过程以及在解决问题时采用的各种技术,此外书中还给出了从调试实际应用程序中提炼出的许多实用技术。因此,如果你希望提高调试CLR应用程序的速度,那么应该仔细阅读本书。本书涵盖了托管程序调试的许多方面——特别是对于一些难以诊断的领域,例如线程同步问题,本书给出了深入而细致的讲解。此外,本书在说明调试技术时使用了大量的示例,使得读者更容易掌握这些技术。
        在本书中重点讲解的调试工具之一就是SOS调试器扩展,这个工具是由CLR小组开发和维护的。每当发布新版本的CLR时,都会对SOS进行升级,使SOS包含更多的新功能。对于分析托管进程中的问题来说,SOS是一种功能强大的工具。它提供的大部分功能都是无法从其他调试工具中获得的。例如,SOS可以找出引用托管堆中某个对象的根对象,这是托管程序开发人员经常遇到的问题之一。在熟悉了这个工具的使用后,你将可以进一步理解程序的工作流程。我还从未见过有其他的书比这本书更详细地介绍SOS。
        当掌握本书介绍的知识后,在分析问题时可以付出更少的时间和精力。我希望读者在阅读这本书时获得的乐趣与我在审阅本书手稿时获得的乐趣是一样的。
     

    精彩书摘

        当加载私有程序集时,它通常只会局限于某个应用程序域中。根据之前对应用程序域的讨论,我们知道在一个.NET应用程序中通常会包含三个应用程序域。除了系统应用程序域和共享应用程序域之外,程序集要么是被加载到默认应用程序域中,要么是被加载到显式创建的应用程序域中。当程序集被加载到某个应用程序域时,它将停留在这个应用程序域中,直到这个应用程序域被销毁。由于程序集都是局限在某个应用程序域中,那么对于任何一个应用程序域,我们如何找出其中加载了哪些程序集?在本章的前面,我们使用了SOS的dumpdomain命令来转储出某个进程中所有的应用程序域。在dumpdomain命令的输出中包含了每个应用程序域中加载的所有程序集。清单2-3给出了在02simple.exe上执行扩展命令dumpdomain时输出的信息。我们可以看到,在默认的应用程序域中包含了两个已加载的程序集:02simple.exe和mscorlib.d11。此外,程序集的名字同样也是它们的地址。当使用SOS的dumpassembly命令来获取每个程序集的进一步信息时,需要用到这些地址。我们可以使用扩展命令dumpassembly,并将程序集的地址作为命令参数来获得更多的信息。
     

    编辑推荐

        这是分析.NET应用程序问题方面的一本全面且实用的参考书。《.NET高级调试》首次专门且系统地介绍了如何分析当前最复杂和最具挑战性的.NET应用程序问题。这是一本介绍如何通过非托管调试器(包括WinDBG、NTSD和CDB等)来调试.NET应用程序的书籍。作者详细阐述了如何借助这些工具找出问题的真实原因——这比使用其他任何调试器都将节省大量的调试时间。作者首先介绍了在使用.NET非托管调试器时的一些关键概念。接下来介绍了许多巧妙的调试技术,并且通过真实的示例来展示各种常见的C#编程错误。
        读者在《.NET高级调试》中可以学到:
        ●使用事后调试技术,包括Power DBG以及其他“强大的调试工具”。
        ●理解在.NET CLR 4.O中包含的新调试功能以及与之前版本的差异。
        ●掌握对Windows调试工具集、SOS、SOSEX、CLR分析器以及其他调试工具的使用。
        ●深入理解CLR内部工作机制,例如分析线程特定的数据、托管堆和垃圾收集器、互用层以及.NET异常等。
        ●解决一些复杂的同步问题、托管堆问题、互用性问题等。
        ●如何生成和分析崩溃转储。
     

    媒体评论

        “对于任何一个.NET开发人员来说,本书都具有极高的参考价值。它包含了许多调试技巧以及CLR内部工作机制的细节,这对于设计软件架构的开发人员来说是非常有益的。”
        ——Jeffrey Richter,Wintellect 公司顾问,培训理由和作者
        “这是Mario推出的又一本好书。他之前著的《Windows高级调试》(与Daniel Pravat合著)对于非托管代码的调试来说是一本不可多得的参考书,而本书同样具有极高的质量,阐述清晰并且探讨深入,因此对于.NET’调试来说同样具有帮助作用。”
        ——Mark Russinovich,微软公司技术顾问
    展开全文
  • VSCode配置 c++ 环境(小白教程)

    万次阅读 多人点赞 2020-01-28 16:26:48
    "MIMode": "gdb", "miDebuggerPath": "D:/MinGW/bin/gdb.exe", // miDebugger的路径,注意这里要与MinGw的路径对应 "preLaunchTask": "g++", // 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc ...
  • vxworks任务+系统调试详解

    千次阅读 2014-02-26 19:36:00
    在调多任务的时候,老是被抢占所困扰,所有人在调试时也要注重,假如其他任务调试任务抢占 ,你设的断点就会没响应一直running下去。下面是调试办法: VxWorks具有两种调试模式 开发工具对目标机运用代 码的...
  • 对Windows开发人员来说,很少有任务调试程序更具挑战性和重要性。然而,人们却往往很难获得一些关干调试技术的可靠而又实用的信息。现在,两位来自Microsoft的系统开发工程师,带着他们15年的实践经验,为读者...
  • C语言程序设计第五版 谭浩强 第五版课后答案

    万次阅读 多人点赞 2019-06-16 00:27:29
    程序:就是一组能识别和执行的指令,每一条指令使计算机执行特定的操作 程序设计:是指从确定任务到得到结果、写出文档的全过程 2.为什么需要计算机语言?高级语言有哪些特点? 为什么需要计算机语言:计算机语言解决...
  • Windows平台高级调试与优化

    千次阅读 2017-08-31 00:00:00
    (2)使用Windows平台上的各种工具解决典型问题的方法和思路,包括使用WinDBG等调试工具调试各类软件故障(应用程序崩溃、系统蓝屏、死循环和多线程死锁、系统挂死、内核态和用户态栈溢出、以及用户态堆和内核态池
  • 精心收集了60个C语言项目源码,分享给大家

    万次阅读 多人点赞 2020-02-27 19:39:45
    计算机二资料(过专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C语言基础-第一个C程序 C语言基础-简单程序分析 VS2019编写简单的C程序示例 简单示例,VS2019调试C语言程序 C语言基础...
  • Visual Studio 调试器.pdf

    2020-05-06 17:30:50
    visual studio 最全的开发调试文档,高级调试帮助你更好的开发和测试。在首次在 Visual Studio 中运行您的应用程序,您可能通过按绿色箭头按钮启动它 工具...的应用程序-它执行-但这些从根本上说是两个非常不同的任务
  • 计算机专业任务

    2018-12-29 17:20:07
    1、独立思考,独立完成:专业实习中各任务的设计和调试要求独立完成,遇到问题可以讨论,但不可以拷贝。做好上机准备:每次上机前,要事先编制好准备调试的程序,认真想好调试步骤和有关环境的设置方法,准备好有关...
  • LINUX平台高级调试和优化

    千次阅读 2018-03-07 00:00:00
    《软件调试高级研习班2018庐山秀峰站》将与各位LINUX爱好者共同探索这个问题的最佳答案。本着生动有趣、理论与实践密切结合的原则,本研习班独辟蹊径,使用调试之剑披荆斩棘,带你闯荡纷繁复杂的LINUX世界。以格物...
  • 这个函数调用严重影响你的调试(断点)策略,你是否想自动化任何类型的中断去探索,你应该停止在函数调用之前,以便检查或修改参数,而不是真正到达汇编里。 Objective-C 和 寄存器 寄存器使用具体的调用约定。你...
  • 【无人机组装与调试】第一章 概述

    千次阅读 多人点赞 2020-07-11 18:20:53
    第一章 无人机组装与调试概述 1.1 什么是无人机? 无人驾驶飞机是指由动力驱动、不搭载操作人员的一种空中飞行器。它依靠空气动力为飞行器提供升力,能够自主或遥控飞行,能携带多种任务设备、执行多种任务,可一...
  • -第一学期 操作系统课程设计任务书 依据纲领和课程内容实践特点结合操作系统LINUX操作系统和嵌入式程序设计课程关键内容课设具体要求及任务以下 一设计结果要求 课程设计应严格根据要求完成在系统调试成功后, 需要...
  • WebStorm 2019下载和安装教程(已测有用)

    万次阅读 多人点赞 2019-07-26 17:08:04
    在JavaScript和Node.js调试工具窗口中使用新的,改进的交互式调试器控制台!它现在使用树视图显示对象,它支持使用CSS设置日志消息样式并使用console.group()和 对它们进行分组console.groupEnd()。您还可以过滤掉...
  • 2021【软件测试】面试题合集大放送

    万次阅读 多人点赞 2019-09-10 18:04:37
    (2) 空间赠送的三域名是否能够访问网站打开网站(空间都赠送三域名),如果也不能访问应该是空间问题。 (3) 在电脑的开始菜单运行中输入cmd,在弹出的黑框中输入:ping 你的域名;然后回车,如果看不到IP或IP...
  • 任务应用函数是一组辅助类函数,一般用于调试信息输出、获取任务句柄、获取任务状态、操作任务标签值等等。 1.获取任务系统状态 1.1函数描述 [objc] view plain copy  print? ...
  • ntsd从Windows 2000开始就是系统自带的进程调试工具,在system32目录下。NTSD的功能非常的强大,用法也比较复杂,但如果只用来结束一些进程,那就比较简单了。在Windows中只有System、SMSS.EXE和CSRSS.EXE不能杀。前两个...
  • C语言图书管理系统设计报告

    万次阅读 多人点赞 2017-06-20 17:37:54
    源代码:https://blog.csdn.net/k_young1997/article/details/73480766 XXXX大学 C语言课程设计报告 题 目 图书管理系统设计 ...专业班级 XXXX计算机科学与技术本科X班 组 别 计科第...
  • 最近有新人在使用vs调试时出现了“此任务要求应用程序具有提升的权限”的提示,每次调试vs就会重启一次。问到我时,我经过查了一番资料才给解决掉了。其实,问题主要是因为直接启动vs项目时没有足够的权限。下面我就...
  • 任务和特权保护

    千次阅读 2014-03-12 20:06:12
    任务的隔离和特权保护 任务, 任务的LDT和TSS 程序是记录在载体上的指令和数据, 总是为了完成某个特定的工作, 其正在执行中的一个副本, 叫做任务(Task). 这句话的意思是说, 如果一个程序有多个副本正在内存中...
  • 安卓* 系统 Java*/C++ 代码调试

    千次阅读 2014-03-12 22:13:42
    1 简介 ...应用开发人员当前可通过安卓* SDK 来设计和构建安卓应用项目,并... 但是它并没有提供相应的功能来调试系统 Java*/C++ 代码,该代码位于安卓代码库中,不能使用 Android SDK 来构建和调试。 本文介绍
  • 当前状态:端口已基本完成,目前为 alpha 质量。您应该能够将rd用于通常使用rr的任务。rr项目不断积累功能和修复,其中许多还没有找到进入rd的方法。然而,期望rd应该相当健壮、完整和可用。请报告任何问题!学分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 140,033
精华内容 56,013
关键字:

任务级调试