精华内容
下载资源
问答
  • spring-aop-4.1.6.RELEASE.jar spring-aspects-4.1.6.RELEASE.jar spring-beans-4.1.6.RELEASE.jar spring-context-4.1.6.RELEASE.jar spring-context-support-4.1.6.RELEASE.jar spring-core-4.1.6.RELEASE.jar ...
  • JetbrainsIdesCrack-4.2-release-sha1
  • spring 3.2.4.RELEASE jar包

    千次下载 热门讨论 2013-10-16 16:16:30
    spring-context-3.2.4.RELEASE.jar spring-core-3.2.4.RELEASE.jar spring-beans-3.2.4.RELEASE.jar spring-test-3.2.4.RELEASE.jar spring-web-3.2.4.RELEASE.jar spring-aop-3.2.4.RELEASE.jar spring-webmvc-...
  • mysql57-community-release-el7-11.noarch.rpm,使用mysql 官方yum 仓库,方法本土下载
  • spring-framework-4.3.3.RELEASE.jar
  • spring-framework-4.2.4.RELEASE-dist

    千次下载 热门讨论 2016-01-12 09:59:34
    spring-framework-4.2.4.RELEASE-dist;官网不好下载了。这里分享下资源给大家,完整的spring开发jar包源码包,说明文档,全都有,最新版本不断更新中。
  • 调试Release程序--Dump文件方式

    热门讨论 2014-05-15 09:52:00
    在Windows平台下用C++开发应用程序,最不想见到的情况恐怕就是程序崩溃,而要想解决引起问题的bug,最困难的应该就是调试release版本了。目前有一些方法可以解决:崩溃地址 + MAP文件;MAP文件;...
  • spring-framework-4.2.3.RELEASE-dist;官网不好下载了。这里分享下资源给大家,完整的spring开发jar包源码包,说明文档,全都有,最新版本不断更新中。
  • hibernate-release-4.3.5.Final.zip

    热门讨论 2014-05-27 18:10:42
    hibernate-release-4.3.5.Final.zip 最新 稳定 最终版
  • 由于zip超过了60M,无法直接上传zip,只能附上记录了下载链接的txt。
  • 64-bit ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy for Windows x64 [Released January 14, 2014] Download ODAC112040Xcopy_64bit.zip - 54.7 MB (57,388,125 bytes) Installation Instructions are ...
  • hibernate-release-5.0.2.Final API.chm

    热门讨论 2015-10-29 16:13:54
    hibernate-release-5.0.2.Final API.chm 参考文档,有了这个,就不用联网查看API参考文档了
  • org.springframework.context-3.1.1.RELEASE.jar

    热门讨论 2014-08-30 00:46:13
    org.springframework.context-3.1.1.RELEASE.jar java 开发专用
  • 1.内存分配问题 2.ASSERT和VERIFY 3.参数问题 4.DLL的灾难 5.RELEASE板中的调试 6.编译器的优化可能导致许多意想不到的错误
  • spring-webmvc-3.2.8.RELEASE.jar
  • cas-server-3.4.10-release和cas-client-3.2.1-release

    千次下载 热门讨论 2013-05-31 11:07:13
    cas的jar包,包括: 服务器端:cas-server-3.4.10-release.zip 客户端:cas-client-3.2.1-release.zip
  • hibernate-release-4.2.21.Final官方原版

    热门讨论 2015-11-19 09:19:52
    hibernate-release-4.2.21.Final官方原版
  • Altium Designer Release 10破解

    热门讨论 2012-06-21 10:36:39
    Altium Designer Release 10破解
  • 5G 核心网 PDU Session Release 信令流程

    千次阅读 2019-10-29 11:03:49
    下面来整理一下 TS 23.502 中的 UE or network requested PDU Session Release for non-roaming and roaming with local breakout 首先是信令流程图: 接着是信令流程图的解读: 为什么会有PDU Session ...

         下面来整理一下 3GPP TS 23.502 V15.11.0 (2020-09) 中的 UE or network requested PDU Session Release for non-roaming and roaming with local breakout

         首先是信令流程图:

     接着是信令流程图的解读:

          为什么会有 PDU Session Release 流程呢? PDU Session Release 流程就是用于释放一些和这个 pdu session 相关的资源的。

          这些资源包括有:

    •        IP 资源
    •        UPF 资源, 包括该 session 使用的 N3、N9、N19 的 隧道资源。
    •        其他 session 使用的资源

           当release procedure 发生时,smf 会通知其他和这个session 有关的 NF,告知他们,这个session要release了。

           对于上图,和 pdu session modify 流程类似,也是将多种trigger情况画在了同一张信令流程图中。

           整理如下:

           1a: UE 发起 (例如通过手机中某个功能)

           1b: PCF发起 (如根据使用量报告,UE超流量( when usage quota reached))

           1c: AMF 发起  (UE和AMF的PDU会话状态不匹配)

           1d: gNB 发起 (例如PDU会话中,所有的QosFlow都已经释放)

           1e: SMF 发起 (例如收到了 UDM 或者 CHF 的请求,例如签约数据变化,或者 计费状态发生变化)

           1f:AMF发起 (例如当前network slice 不可用)

     

           在上面 6 种情况中,如果是 1C 触发,那么smf回复3C,并且会跳过4-11步,这个是需要注意一下的。(其他步骤都是要到step11 才会使用notify通知到AMF)

    注:下文的发xxxx消息,其实是调用对应网元的相关服务,例如SMF提供的服务,可以在TS  29502 查询到对应的uri)

    以下是每个流程的大概内容,细节请参考 23502 4.3.4

            1a UE 发起 release 请求。

                 UE 会发起这个 pdu session release 的procedure. UE会发一个nas消息给GNB。 这个 nas 消息是:PDU session Release Request.

                 然后,GNB 使用 UL NAS Transport 将消息发给AMF。

                 NAS PDU: N1 sm container( PDU session Release Request, pdu session id) pdu session id

                 这里有两 pdu id ,容器里面的 pdu session id是给smf的,外面的pdu session id是给amf的。

                 AMF 收到这个UL NAS Transport后,将会发 nsmf pdu session updateSMContext 给smf, 主要是带N1 container 里面的内容给smf, 同时带上从RAN接收到的 user location info (ULI) 

            1b PCF 发起 release 请求。

                 PCF 可能会发起一个 SM Policy Association Termination 流程 来触发 session release。这个流程定义在 4.16.6 23502.

                 在下图中,pcf 发起的release是步骤1a, 对应的信令是29512的4.2.3.3 SM Policy Association termination request。

     

            1c  AMF 发起 release 请求。

                 当 UE 和 AMF 的PDU session 状态不匹配时,AMF 会发起一个  Nsmf_Pdusession_release 请求,去要求SMF

    release session。

            1d  (R)AN发起的release

                 无线接入网络可以指示SMF去释放这个 PDU session 相关的资源。例如呢,当这个 PDU session 相关的QOS flow 都已经释放完毕。上图中的1d N2 Message 其实就是 38413 中的9.2.1.7 PDU SESSION RESOURCE NOTIFY,

                 AMF 将38413 9.3.4.13 PDU Session Resource Notify Released Transfer 放在 update_smctx 消息中带给SMF,此时N2SmInfoType = "PDU_RES_NTY_REL"。

            1e  SMF发起的release

                  在以下情况中,SMF 会决定 release PDU session.

                  -  基于 DN 的请求

                  -  基于UDM的请求(签约数据变更)或者 CHF 的请求

                  -  SMF 收到了 AMF 的 event notification.( UE 已经不在 LAND service area )

                  -  基于 SMF 的本地配置策略

                  -  收到了 RAN 的通知 :在 mobility procedure PDU session est failed.

            1f  AMF 发起一个update请求,里面含有 release session 的指示。

     

             2 SMF 发送 pfcp session delete req 给UPF

                   在这一步中,SMF 要释放分配给这个 pdu session 的ip资源,并且要释放对应的 user plane 资源。

                   在2a中,SMF 发送 pfcp session delete req 给UPF,然后UPF应该 drop 掉这个 session 的数据包,并且释放对应的

    tunnel resource。

                   在2b中,UPF 回复 pfcp session delete rsp 给 SMF。

                   如果有多个 UPF 和这个 PDU session 有关联(例如 ULCL, multiho bP),那么每个UPF都要执行这个 pdu session release procedure. 

     

           

                第三步有多种情况,分别对应步骤1的各种情况。

                如果 这个 pdu sesson release 是由 PCF 和 SMF 触发,并且SMF已经 notify AMF 这个UE是unreachable的(例如UE MICO 模式开启),这个应该是amf 通过 event notify 告知SMF的,这个流程会接着跑 step 11. (也就是跳过了step4-10),

                SMF 会发送 nsmf pdu session smContextStatusNotify 给 AMF,过后接着执行步骤12.

                如果 release 流程是由 1a 1b 1d 和1e 触发的。SMF会创建一个 N1 SM, 包含 pdu session release Command(带有

    pdu sess id, cause)。这个 cause 可能包含一个 trigger, 会 trigger 建立一个使用同样 character 的pdu sess.

                如果用户面是actived的,那么SMF 发给AMF的消息应该包含 N2 SM resouce release req. 如果不actived,那就不带了。ok,就这样子。

               3a 是对应 1a 和 1d 的,SMF 会复一个 nsmf pdu session updateSmContext Rsp(带有N2 SM resouce release request 和 N1 SM container(带的就是 pdu session release cmd))。

               注意,就像上面所说的,当user plane 是actived 时,N2 SM resouce release request 才会 present。

               3b 是对应于 SMF 或者 PCF 发起的release。 这时,SMF 会发送 N1N2 transfer 给 AMF. 这个消息会带有 N1 SM container(其实就是消息: PDU session release cmd),还带有 skip indicator.

                同样地,如果user plane 是actived的,那么也要带上N2 resouce release request。这样做是为了 释放 RAN 和这个 pdu session相关的资源。

                那么这个  skip indicator,有什么作用呢?这个skip indicator 会告诉AMF是否需要跳过发送 N1 SM container 给UE。(例如当 UE 处于 IDLE 状态)。一般来说,smf 都会带这个IE,除了 procedure is triggered to change PDU Session Anchor of a PDU Session with SSC mode 2.

                如果 UE 处于 IDLE 状态,并且smf发过来的消息带了skip indicator,那么AMF 会通过 N1 N2 transfer rsp 告诉 SMF,"N1 SM Message Not Transferred",这时,step4-10 就跳过了。

               3c 是对应于1c中的AMF发起的release。SMF 收到 release sm context req 后,回复AMF 一个对应的rsp. 这个AMF应该删除所以有的和这个 pdu session 相关的context。并且删除相关的订阅。 step4-11 就跳过了。

               3d 是对应于1f中AMF发起的release。这个是由于 network slice 改变 或者 network slice 不可用导致的。同样地,如果user plane 是actived的,那么也要带上N2 resouce release request。这样做是为了 释放 RAN 和这个 pdu session相关的资源。

               

            4 AMF 发 N2 resource release req

                其实这个消息是个 NGAP 消息, 叫做 PDU session resouce relase cmd , 这个消息里面会封装有一个 nas pdu,叫做PDU session release cmd 。

                如果 UE 是 idle 状态,并且"N1 SM delivery can be skipped" is not indicated, the AMF initiates the network triggered Service Request procedure to transmit the NAS message (PDU Session ID, N1 SM container) to the UE and the steps 6, 7 are skipped.

                如果 如果在第三步中,smf 发过来的消息没有带 N2 SM resource request,那么AMF ransmit the NAS message (PDU Session ID, N1 SM container) to the UE and the steps 6, 7 are skipped.

                如果 UE 是 CM-CONTECTED 状态,那就N1 N2的消息都会带个RAN。

     

            5 这是一个NAS 消息:PDU session release cmd (TS 24501)

                 In the case of a NG-RAN, the NAS message is sent to the UE in an RRC message which may take place with the UE releasing the NG-RAN resources related to the PDU Session. If NG-RAN resources do not need to be released (i.e. the User Plane of the PDU Session is deactivated), the NAS message is sent to the UE in an RRC message which does not release the NG-RAN resources related to the PDU Session.

           6 RAN 回复 N2 resouce release ack ( TS 38413)

                消息是ngap: pdu sesssion resouce release rsp.  会带有 user location info, secondary RAT usage data.

           7  AMF 发送 nsmf pdusession update sm context 给SMF。

                消息中带有 N2 SM resouce release ACK 和 ULI

                SMF 收到后,回复 rsp

           8 

                UE 通过 一个 nas 消息:PDU session relese complete 回复 RAN

           9   

                RAN 封一个 UL NAS Transport,里面有一个 NAS pdu 就是PDU session relese complete,去告诉AMF,UE 的资源已经释放。

          10a.       

              The AMF invokes the Nsmf_PDUSession_UpdateSMContext (N1 SM container (PDU Session Release Ack, User Location Information) to the SMF.


          10b.    

                  The SMF responds to the AMF with an Nsmf_PDUSession_UpdateSMContext response.
                  Steps 8-10 may happen before steps 6-7. --------------》 要注意一下这个

          11 

                SMF 发notify给 AMF。

                SMF 发送Nsmf pdu session sm contex status notify 给AMF。 告知AMF 这个 和 pdu seesion 相关的 SM context 都已经释放完毕。AMF 就会删除和这个 pdu session 相关联的 pdu session id dnn s-nssai 等。

           12 释放和Pcf的会话

               

            

              

          If Dynamic PCC applied to this session the SMF invokes an SM Policy Association Termination procedure as defined in clause 4.16.6 to delete the PDU Session.

          SMF notifies any entity that has subscribed to User Location Information related with PDU Session change.

          If it is the last PDU Session the SMF is handling for the UE for the associated (DNN, S-NSSAI), the SMF unsubscribes from Session Management Subscription data changes notification with the UDM by means of the Nudm_SDM_Unsubscribe (SUPI, DNN, S-NSSAI) service operation. The UDM may unsubscribe the subscription notification from UDR by Nudr_DM_Unsubscribe (SUPI, Subscription Data, Session Management Subscription data, DNN, S-NSSAI).

          The SMF invokes the Nudm_UECM_Deregistration service operation including the DNN and the PDU Session Id. The UDM removes the association it had stored between the SMF identity and the associated DNN and PDU Session Id. The UDM may update this information by Nudr_DM_Update (SUPI, Subscription Data, UE context in SMF data).

               

     

           

     

               

     

     

               

     

     

                 

     

           

     

    展开全文
  • 1.网上下载JetbrainsCrack-2.6.10-release-enc.jar文件 2.把JetbrainsCrack-2.6.10-release-enc.jar文件放到idea安装目录的bin目录下 3.在D:\Idea\IntelliJ IDEA 2019.1.2\bin目录下,打开...

    IDEA是一款非常好用的开发工具,在使用的时候可能会面临激活问题,下面提供一个激活IDEA的教程:

    1.网上下载JetbrainsCrack-2.6.10-release-enc.jar文件
    2.把JetbrainsCrack-2.6.10-release-enc.jar文件放到idea安装目录的bin目录下

    在这里插入图片描述
    3.在D:\Idea\IntelliJ IDEA 2019.1.2\bin目录下,64位的系统打开idea64.exe.vmoptions两个文件
    在这里插入图片描述
    4.在idea64.exe.vmoptions最后一行添加"-javaagent:D:\Idea\IntelliJ IDEA 2019.1.2\bin\JetbrainsCrack-2.6.2.jar"
    在这里插入图片描述
    5.打开idea,复制下面的代码到Activation code里面

    ThisCrackLicenseId-{
    “licenseId”:“ThisCrackLicenseId”,
    “licenseeName”:“username”,
    “assigneeName”:"",
    “assigneeEmail”:“XXXX@163.com”,
    “licenseRestriction”:“For This Crack, Only Test! Please support genuine!!!”,
    “checkConcurrentUse”:false,
    “products”:[
    {“code”:“II”,“paidUpTo”:“2019-12-31”},
    {“code”:“DM”,“paidUpTo”:“2019-12-31”},
    {“code”:“AC”,“paidUpTo”:“2019-12-31”},
    {“code”:“RS0”,“paidUpTo”:“2019-12-31”},
    {“code”:“WS”,“paidUpTo”:“2019-12-31”},
    {“code”:“DPN”,“paidUpTo”:“2019-12-31”},
    {“code”:“RC”,“paidUpTo”:“2019-12-31”},
    {“code”:“PS”,“paidUpTo”:“2019-12-31”},
    {“code”:“DC”,“paidUpTo”:“2019-12-31”},
    {“code”:“RM”,“paidUpTo”:“2019-12-31”},
    {“code”:“CL”,“paidUpTo”:“2019-12-31”},
    {“code”:“PC”,“paidUpTo”:“2019-12-31”}
    ],
    “hash”:“2911276/0”,
    “gracePeriodDays”:7,
    “autoProlongated”:false}

    6.点击ok,注册完成!

    展开全文
  • Debug与Release版本的区别详解

    千次阅读 2018-08-28 11:34:22
    Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动。如果我们愿意,我们完全可以把Debug和Release的行为完全颠倒过来。当然也可以提供其他的模式,...

    Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动。如果我们愿意,我们完全可以把Debug和Release的行为完全颠倒过来。当然也可以提供其他的模式,例如自己定义一组编译选项,然后命名为MY_ABC等。习惯上,我们仍然更愿意使用VC已经定义好的名称。
         Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于ATL的,则Debug和Release版本对DLL的要求差不多。如果采用的编译选项为使用MFC动态库,则需要MFC42D.DLL等库支持,而Release版本需要MFC42.DLL支持。Release不对源代码进行调试,不考虑MFC的诊断宏,使用的是MFC Release库,编译时对应用程序的速度进行优化,而Debug则正好相反,它允许对源代码进行调试,可以定义和使用MFC的 诊断宏,采用MFC Debug库,对速度没有优化。
     既然Debug和Release仅仅是编译选项的不同,那么为什么要区分Debug和Release版本呢?
        Debug和Release,在我看来主要是针对其面向的目标不同的而进行区分的。Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供强大的应用程序调试能力。而Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。

        下面仅就默认的Debug和Release版本的选项进行 比较,详细的编译选项可以看MSDN的说明。
        我们将默认的Debug和Release的选项设置进行比较,过滤掉相同设置,主要的不同如下:
    编译选项:/Od /D "_DEBUG" /Gm /RTC1 /MDd /Fo"Debug““" /ZI
    链接选项:/OUT:"D:“MyProject“logging“Debug“OptionTest.dll" /INCREMENTAL
    Release设置:
    编译选项:/O2 /GL /D "NDEBUG" /FD /MD /Fo"Release““" /Zi
    链 接选项:/OUT:"D:“MyProject“logging“Release“OptionTest.dll" /INCREMENTAL:NO

    Debug 版本: 
    /MDd /MLd 或 /MTd使用 Debug runtime library(调试版本的运行 时刻函数库)
    /Od 关闭优化开关 
    /D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码 开关(主要针对assert函数)
    /ZI 创建 Edit and continue数据库,在调试 过程中如果修改了源代码不需重新编译
    /GZ 可以帮助捕获内存错误 
    /Gm 打开最小化重链接开关,减少链接时 间 
    Release 版本: 
    /MD /ML 或 /MT使用发布版本的运行时刻函数库 
    /O1 或 /O2优 化开关,使程序最小或最快 
    /D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)
    /GF 合并重 复的字符串,并将字符串常量放到只读内存,防止被修改 

    MDd与MD
        首先,Debug版本使用调试版本的运行时库(/MDd选项),Relase版本则使用的是发布版本的运行时库(vcrt.dll)。其区别主要在于运行时的性能影响。调试版本的运行时库包含了调试信息,并采用了一些保护机制以帮助发现错误,也因此,其性能不如发布版本。编译器提供的Runtime Library很稳定,不会造成Release版本错误,倒是由于Debug版本的Runtime Library加强了对错误的检测,如堆内存分配检查等,反而会报告错误,应当指出,如果Debug有错误,而Release版本正常,程序肯定是有Bug的,只是我们还没有发现。
    ZI与Zi
        其次,/ZI选项与/Zi选项。通过使用/ZI选项,可以在调试过程修改代码 而不需要重新编译。这是个调试的好帮手,可如果我们使用Release版本,这将变得不可行。

    Od与O2
        /O2与/Od选项:Od是关闭编译器优化,普遍用于Debug版本。而O2选项是创建最快速代码,这当然是Release版本的不二选择。

    RTCx选 项
         /RTCx选项让编译器插入动态检测代码以帮助你检测程序中的错误。比如,它会将局部变量初始化为非零值。包括用0xCC初始化所有自动变量,0xCD初始化堆中分配的内存(即new的内存),使用0xDD填充被释放的内存(即delete的内存),0xFD初始化受保护的内存(debug版在动态分配内存的前后加入保护内存以防止越界访问)。这样做的好处是这些值都很大,一般不可能作为指针,考试,大提示作为数值也很少用到,而且这些值很容易辩认,因此有利于在Debug版本中发现Release版才会遇到的错误。另外,通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性(防止原型不匹配)。使用/RTCx选项会造成Debug版本出错,而Release版本正常的现象,因为Release版中未初始化的变量是随机的,很可能使指针指向了有效但是错误的地址,从而掩盖了错误。这个编译选项只能在/Od选项下使用。

    Gm,INCREMENTAL or NO
         编译选项中的Gm和链接选项中的INCREMENTAL都只为一个目的,加快编译速度。我们经常遇上这样的问题,只修改了一个头文件,结果却造成所有动态库的重新编译。而这两个选项就是为了解决这样的问题。如果启用了/Gm开关,编译器在项目中的.idb文件中存储了源文件和类定义之间的依赖关系。之后的编译过程中使用.idb文件中的信息确定是否需要编译某个源文件,哪怕是此源文件已经包含了已修改的.h文件。
         INCREMENTAL开关默认是开启的。使用增量链接生 成的可执行文件或者动态链接库会大于非增量链接的程序,因为有代码和数据的填充。另外,增量链接的文件还包含跳转trunk以处理函数重定位到新地址。
         MSDN 上明确指出:为确保最终发布版本不包含填充或者trunk,请非增量链接程序。

    /GZ 选项:做以下这些事 
         1.初 始化内存和变量。包括用 0xCC初始化所有自动变量,0xCD ( Cleared Data )初始化堆中分配的内存(即动态分配 的内存,例如 new),0xDD ( Dead Data )填充已被释放的堆内存(例 如 delete),0xFD( deFencde Data )初始化受保护的内存(debug版在动态分配内存的前后加入保护内存以防止越界访问),其中括号中的词是微软建议的助记词。这样做的好处是这些值都很大,作为指针是不可能的(而且32 位系统中指针很少是奇数值, 在有些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容易辨认,因此这很有利于在Debug 版中发 现Release 版才会遇到的错误。要特别注意的是,很多人认为编译器会用0 来初始化变量,这是错误的(而且这样很不利于查找错 误)。
         2. 通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性。(防止原形不匹配) 
    3. 函数返回前检查 栈指针,确认未被修改。(防止越界访问和原形不匹配,与第二项合在一起可大致模拟帧指针省略FPO )

        通常 /GZ 选 项会造成Debug 版出错而Release 版正常的现象,因为Release 版中未初始化的变量是随机的,这有可能使指针指向一 个有效地址而掩盖了非法访问。

    _DEBUG与NDEBUG
         这是最重要的一个选项。这两个是编译器的预处理器定义,默认情况下_DEBUG用于Debug版本,而NDEBUG用于Release版本。 它们可以说是重要的无以复加。因为,assert系列的断言仅仅在_DEBUG下生效!
    下面是assert.h文件中摘出来的:
    C++代码 

     
    1. 1 #ifdef NDEBUG

    2. 2 #define assert(_Expression) ((void)0)

    3. 3 #else /* NDEBUG */

    4. 4 #ifdef __cplusplus

    5. 5 extern "C" {

    6. 6 #endif /* __cplusplus */

    7. 7 _CRTIMP void __cdecl _wassert(__in_z const wchar_t * _Message, __in_z const wchar_t *_File, __in unsigned _Line);

    8. 8 #ifdef __cplusplus

    9. 9 }

    10. 10 #endif /* __cplusplus */

    11. 11 #define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

    12. 12 #endif /* NDEBUG */

    可以看出在未定义_DEBUG时,assert变成一条空语句不被执行。
    也就是说,我们现在所有发布的版本无法使 用断言机制进行程序调试。

    相关经验:
       1. 变量。
        大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc,而release的赋值近似于随机。如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug方式下可能会忽略而不被察觉到。debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了。
        2. 自定义消息的消息参数。
        MFC为我们提供了很好的消息机制,更增加了自定义消息,好处我就不用多说了。这也存在debug跟release的问题吗?答案是肯定的。在自定义消息的函数体声明时,时常会看到这样的写法:afx_msg LRESULT OnMessageOwn(); Debug 情况下一般不会有任何问题,而当你在Release下且多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。导致这个错误直接原因是消息体的参数没有添加,即应该写 成:afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam); 3. release模式下不出错,但debug模式下报错。
         这种情况下大多也是因为代码书写不正确引起的,查看MFC 的源码,可以发现好多ASSERT的语句(断言),这个宏只是在debug模式下才有效,那么就清楚了,release版不报错是忽略了错误而不是没有错误,这可能存在很大的隐患,因为是Debug模式下,比较方便调试,好好的检查自己的代码,再此就不多说了。
        3. ASSERT, VERIFY, TRACE.......... 调试宏
        这种情况很容易解释。举个例子:请在VC下输入ASSERT然后选中按F12跳到宏定义的地方,这里你就能够发现Debug中ASSERT要执行AfxAssertFailedLine,而Release下的宏定义却为\"#define ASSERT(f) ((void)0)\"。所以注意在这些调试宏的语句不要用程序相关变量如i++写操作的语句。
    VERIFY 是个例外,\"#define VERIFY(f) ((void)(f))\",即执行。

        哪些情况下Release版会出错?
        1. Runtime Library:链接哪种运行时刻函数库通常只对程序的性能产生影响。调试版本 的 Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,因此性能不如发布版本。编译器提供 的Runtime Library 通常很稳定,不会造成Release 版错误;倒是由 于Debug 的Runtime Library 加强了对错误的检测,如堆内存分配,有时会出现Debug 有错 但Release 正常的现象。应当指出的是,如果Debug 有错,即使Release 正常,程序肯定是有Bug 的,只不 过可能是Release 版的某次运行没有表现出来而已。

        2. 优化:这是造成错误的主要原因,因为关闭优化时源程序基本上是直接翻译的,而打开优化后编译器会作出一系列假设。这类错误主要有以下几种:
        (1) 帧指针 (Frame Pointer)省略(简称FPO ):在函数调用过程中,所有调用信息(返回地址、参数)以及自动变量都是放在栈中的。若函数的声明与实现不同(参数、返回值、调用方式),就会产生错误,但Debug 方式下,栈的访问通过EBP 寄存器保存的地址实现,如果没有发生数组越界之类的错误(或是越界“不多”),函数通常能正常执行;Release方式下,优化会省略 EBP栈基址指针,这样通过一个全局 指针访问栈就会造成返回地址错误是程序崩溃。C++的强类型特性能检查出大多数这样的错误,但如果用了强制类型转换,就不行了。你可以 在 Release 版本中强制加入/Oy- 编译选项来关掉帧指针省略,以确定是否此类错误。此类错误通常有:

         MFC消息响应函数书写错误。正确的应为 
    afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam); 
    ON_MESSAGE 宏 包含强制类型转换。防止这种错误的方法之一是重定义 ON_MESSAGE宏,把下列代码加到 stdafx.h中 (在#include "afxwin.h"之后),函数原形错误时编译会报错

    C++代码 

     

     
    1. 13 #undef ON_MESSAGE

    2. 14 #define ON_MESSAGE(message, memberFxn) \

    3. 15 { message, 0, 0, 0, AfxSig_lwl, \

    4. 16 (AFX_PMSG)(AFX_PMSGW)(static_cast< LRESULT (AFX_MSG_CALL \

    5. 17 CWnd::*)(WPARAM, LPARAM) > (&memberFxn) },


     

    (2) volatile 型变量:volatile告诉编译器该变量可能被程序之外的未知方式修改(如系统、其他进程和线程)。优化程序为了使程序性能提高,常把一些变量放在寄存器中(类似于register 关键字),而其他进程只能对该变量所在的内存进行修改,而寄存器中的值没变。如果你的程序是多线程的,或者你发现某个变量的值与预期的不符而你确信已正确的设置了,则很可能遇到这样的问题。这种错误有时会表现为程序在最快优化出错而最小优化正常。把你认为可疑的变量加上volatile 试试。

        (3) 变量优化:优化程序会根据变量的使用情况优化变量。例如,函数中有一个未被使用的变量,在 Debug 版中它有可能掩盖一个数组越界,而在Release 版中,这个变量很可能被优化调,此时数组越界会破坏栈中有用的数据。当然,实际的情况会比这复杂得多。与此有关的错误有:
    非法访问,包括数组越界、指针错误 等。例如 

    C++代码 

     

     
    1. 18 void fn(void)

    2. 19 {

    3. 20 int i;

    4. 21 i = 1;

    5. 22 int a[4];

    6. 23 {

    7. 24 int j;

    8. 25 j = 1;

    9. 26 }

    10. 27 a[-1] = 1; //当然错误不会这么明显,例如下标是变量

    11. 28 a[4] = 1;

    12. 29 }


     

    j 虽然在数组越界时已出了作用域,但其空间并未收回,因而i 和j 就会掩盖越界。而Release 版由于i、j并未其很大作用可能会被优化掉,从而使栈被破坏。 

        3. _DEBUG 与 NDEBUG:当定义了 _DEBUG时,assert()函数会被编译, 而 NDEBUG时不被编译。除此之外,VC++中还有一系列断言宏。这包括:

    ANSI C 断 言 void assert(int expression );
    C Runtime Lib 断 言 _ASSERT( booleanExpression );
    _ASSERTE( booleanExpression ); 
    MFC 断 言 ASSERT( booleanExpression );
    VERIFY( booleanExpression ); 
    ASSERT_VALID( pObject ); 
    ASSERT_KINDOF( classname, pobject ); 
    ATL 断 言 ATLASSERT( booleanExpression );
    此外,TRACE() 宏的编译也受_DEBUG 控 制。

        所有这些断言都只在 Debug版中才被编译,而在Release 版中被忽略。唯一的例外 是VERIFY() 。事实上,这些宏都是调用了assert() 函数,只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用 等),那么Release 版都不会执行这些操作,从而造成错误。初学者很容 易犯这类错误,查找的方法也很简单,因为这些宏都已在上面列出,只要利用VC++ 的Find in Files 功能在工程所有文件中 找到用这些宏的地方再一一检查即可。另外,有些高手可能还会加入#ifdef _DEBUG 之类的条件编译,也要注意一下。
    顺便值 得一提的是 VERIFY() 宏,这个宏允许你将程序代码放在布尔表达式里。这个宏通常用来检查Windows API 的返回值。有些人 可能为这个原因而滥用VERIFY() ,事实上这是危险的,因为VERIFY() 违反了断言的思想,不能使程序代码和调试代码完全分离, 最终可能会带来很多麻烦。因此,专家们建议尽量少用这个宏。

        一、"Debug是调试版本,包括的程序信息更多"
        补充:只有DEBUG版的程序才能设置断点、单步执行、使用TRACE/ASSERT等调试输出语句。REALEASE不包含任何调试信息,所以体积小、运行速度快。

        I. 内存分配问题 
        1. 变量未初始化。下面的程序在debug中运行的很好。

    C++代码 

     

     
    1. 30 thing * search(thing * something)

    2. 31 BOOL found;

    3. 32 for(int i = 0; i < whatever.GetSize(); i++)

    4. 33 {

    5. 34 if(whatever[i]->field == something->field)

    6. 35 { /* found it */

    7. 36 found = TRUE;

    8. 37 break;

    9. 38 } /* found it */

    10. 39 }

    11. 40 if(found)

    12. 41 return whatever[i];

    13. 42 else

    14. 43 return NULL;


     

    而在release中却不行,因为debug中会自动给变量初始化found=FALSE,而在release版中则不会。所以尽可能的给变量、类或结构 初始化。 

        2. 数据溢出的问题 
        如:

    C++代码 

    44 char buffer[10]; 

    45 int counter; 

    46 lstrcpy(buffer, "abcdefghik"); 


        在debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没有。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。

        3. DEBUG版和RELEASE版的内存分配方式是不同的 。如果你在DEBUG版中申请ele 为6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytes(debug版以32bytes为单位分配), 而在release版,分配给你的就是24bytes(release版以8bytes为单位),所以在debug版中如果你写ele[6],可能不会有什么问题,而在release版中,就有ACCESS VIOLATE。 

        II. ASSERT和VERIFY

        1. ASSERT在Release版本中是不会被编译的。

        ASSERT宏是这样定义的 

    C++代码 

    47 

    48 #ifdef _DEBUG 

    49 #define ASSERT(x) if( (x) == 0) report_assert_failure()

    50 #else 

    51 #define ASSERT(x) 

    52 #endif 


        实际上复杂一些,但无关紧要。假如你在这些语句中加了程序中必须要有的代码 
    比如 

    C++代码 

    53 

    54 ASSERT(pNewObj = new CMyClass); 

    55 

    56 pNewObj->MyFunction(); 


    这种时候Release版本中的pNewObj不会分配到空间

    所以执行到下一个语句的时候程序会报该程序执行了非法操作的错误。这时可以用VERIFY: 

    C++代码 

    57 

    58 #ifdef _DEBUG 

    59 #define VERIFY(x) if( (x) == 0) report_assert_failure()

    60 #else 

    61 #define VERIFY(x) (x) 

    62 #endif 


    这样的话,代码在release版中就可以执行了。

    III. 参数问题: 

    自定义消息的处理函数,必须定义如下: 
    afx_msg LRESULT OnMyMessage(WPARAM, LPARAM); 
    返回值必须是HRESULT型,否则Debug会过,而Release出错

        IV. 内存分配 
        保证数据创建和清除的统一性:如果一个DLL提供一个能够创建数据的函数,那么这个DLL同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一 个层次上。

        V. DLL的灾难 
        人们将不同版本DLL混合造成的不一致性形象的称为“动态连接库的地狱“(DLL Hell),甚至微软自己也这么说 http://msdn.microsoft.com/library/techart/dlldanger1.htm)

        如果你的程序使用你自己的DLL时请注意:

        1. 不能将debug和release版的DLL混合在一起使用。debug都是debug版,release版都是release版。
    解决办法是将debug和release的程序分别放在主程序的debug和release目录下

        2. 千万不要以为静态连接库会解决问题,那只会使情况更糟糕。 

    VI. RELEASE版中的调试 : 
        1. 将ASSERT()改为 VERIFY()。找出定义在"#ifdef _DEBUG"中的代码,如果在RELEASE版本中需要这些代码请将他们移到定义外。查找TRACE(...)中代码,因为这些代码在RELEASE中也不被编译。 请认真检查那些在RELEASE中需要的代码是否并没有被便宜。
        2. 变量的初始化所带来的不同,在不同的系统,或是在DEBUG/RELEASE版本间都存在这样的差异,所以请对变量进行初始化。
        3. 是否在编译时已经有了警告?请将警告级别设置为3或4,然后保证在编译时没有警告出现.

        VII. 将Project Settings"中 "C++/C "项目下优化选项改为Disbale(Debug)。编译器的优化可能导致许多意想不到的错误,请参http://www.pgh.net /~newcomer/debug_release.htm 

        1. 此外对RELEASE版本的软件也可以进行调试,请做如下改动:

        在"Project Settings"中"C++/C"项目下设置"category"为"General"并且将"Debug Info"设置为"Program Database"。

        在"Link"项目下选中"Generate Debug Info"检查框。

        "Rebuild All" 

        如此做法会产生的一些限制: 

        无法获得在MFC DLL中的变量的值。必须对该软件所使用的所有DLL工程都进行改动。

    另: 

        1. MS BUG:MS的一份技术文档中表明,在VC5中对于DLL的"Maximize Speed"优化选项 并未被完全支持,因此这将会引起内存错误并导致程序崩溃。 

        2. http://www.sysinternals.com/有一个程序DebugView,用来捕捉OutputDebugString的输出,运行起来后(估计是自设为system debugger)就可以观看所有程序的OutputDebugString的输出。此后,你可以脱离VC来运行你的程序并观看调试信息。

        3. 有一个叫Gimpel Lint的静态代码检查工具,据说比较好用http://www.gimpel.com/不过要化$的。

        Debug与Release不同的问题在刚开始编写代码时会经常发生,99%是因为你的代码书写错误而导致的,所以不要动不动就说系统问题或编译器问题,努力找找自己的原因才是根本。我从前就常常遇到这情况,经历过一次次的教训后我就开始注意了,现在我所写过的代码我已经好久没遇到这种问题了。下面是几个避免的方面,即使没有    这种问题也应注意一下:
        1. 注意变量的初始化,尤其是指针变量,数组变量的初始化(很大的情况下另作考 虑了)。
        2. 自定义消息及其他声明的标准写法
        3. 使用调试宏时使用后最好注释掉
        4. 尽量使用 try - catch(...)
        5. 尽量使用模块,不但表达清楚而且方便调试。

    展开全文
  • maven release操作

    千次阅读 2020-07-29 22:26:19
    在我们开发过程中,测试已经测试完,我们需要将snapshot包转成release包,以前我们往往是这样操作的 1.修改pom的版本号为release,然后mvn deploy 2.提交代码,并打tag 3.修改代码版本为snapshot加1 这些操作非常...

    在我们开发过程中,测试已经测试完,我们需要将snapshot包转成release包,以前我们往往是这样操作的

    1.修改pom的版本号为release,然后mvn deploy

    2.提交代码,并打tag

    3.修改代码版本为snapshot加1

    这些操作非常繁琐,而且容易出错,特别是在maven多模块中,更是头疼,那么有没有简单的操作呢?

    当然有,我们需要用到mvn release

    mvn  release:prepare

    mvn  release:rollback

    mvn  release:perform

    prepare命令做了哪些操作:

    1.检查项目是否有未提交的代码。

    2.检查项目是否有快照版本依赖。

    3.根据用户的输入将快照版本升级为发布版。

    4.将POM中的SCM信息更新为标签地址。

    5.基于修改后的POM执行Maven构建。

    6.提交POM变更。

    7.基于用户输入为代码打标签。

    8.将代码从发布版升级为新的快照版。

    9.提交POM变更。

    perform命令做了哪些操作:

     1.生成doc文档

     2.删除release.properties等发布过程文件

    3.迁出release:prepare生成的标签中的源代码,并在此基础上执行mvn deploy命令打包并部署构件至仓库。

     

    首先需要配置好maven的settings文件,注意,这里配置的仓库Snapshot和Release仓的仓库类型也必须为这两种

     

     

     

    
    
    
    <server>
    
    <id>nexus-releases</id>
    
    <username>admin</username>
    
    <password>******</password>
    
    </server>
    
    
    
    <server>
    
    <id>nexus-snapshots</id>
    
    <username>admin</username>
    
    <password>******</password>
    
    </server>
    
    <profile>
    
    <id>nexus</id>
    
    <properties>
    
    <altSnapshotDeploymentRepository>
    
    nexus-snapshots::default::http://192.168.80.131:8081/repository/maven-snapshots/
    
    </altSnapshotDeploymentRepository>
    
    <altReleaseDeploymentRepository>
    
    nexus-releases::default::http://192.168.80.131:8081/repository/maven-releases/
    
    </altReleaseDeploymentRepository>
    
    </properties>
    
    </profile>
    
    <activeProfiles>
    
    <activeProfile>nexus</activeProfile>
    
    </activeProfiles>

     

    一、配置scm,如果是多模块,在父pom中配置即可

    <scm>
    
    <developerConnection>scm:git:http://192.168.80.130/dray/base-service.git</developerConnection>
    
    </scm>

    二、配置插件

    <plugin>
    
    <groupId>org.apache.maven.plugins</groupId>
    
    <artifactId>maven-release-plugin</artifactId>
    
    <configuration>
    
    <autoVersionSubmodules>true</autoVersionSubmodules>
    
    <tagNameFormat>v@{project.version}</tagNameFormat>
    
    <generateReleasePoms>false</generateReleasePoms>
    
    <arguments>-DskipTests</arguments>
    
    </configuration>
    
    </plugin>

    三、预处理

    mvn -B release:prepare -Dusername=dray -Dpassword=******
    
    或者
    
    mvn -B release:prepare-with-pom

    -Dusername=dray -Dpassword=****** 为scm的账号,为了方便cicd可以动态指定

    -B为非交互式执行,如果需要自定义指定发布的版本,tag名称,和发布后的版本,可执行

    mvn --batch-mode -Dtag=my-proj-1.2 release:prepare \ -DreleaseVersion=1.2 \ -DdevelopmentVersion=2.0-SNAPSHOT

    图为自动打的tags

    图为nexus包信息

     

    四、回滚

    mvn -B release:rollback

    五、确定处理

     mvn -B release:perform -DuseReleaseProfile=false

    DuseReleaseProfile指定了不生成javadoc api文档,因为一般会报错,这里就直接不生成

    tips:

    除了上述功能,maven release还有其他妙用

    maven官网

    首先我们讲解下release:update-versions,这个插件主要的作用是修改我们本地pom版本信息,如:

    mvn -B release:update-versions -DdevelopmentVersion=1.2.0-SNAPSHOT

    修改pom的版本号,不加-DdevelopmentVersion,默认最后一位加一,比如我们的pom版本号为1.2.0-SNAPSHOT,使用这行命令后就变变成1.2.1-SNAPSHOT,和mvn versions:set -DnewVersion=xxxx 功能重叠,主要release:update-versions为官方插件,可通过设置autoVersionSubmodules=true来同步修改子模块,此命令并不会讲本地修改后的pom提交到gitlab,需要手动提交

     

    接下来release:branch闪亮登场,从官方文档上我们可以看出,此命令的作用就是从当前工程(分支)创建出新的分支,并修改版本号

    常用的命令如下:

    mvn -B release:branch -DbranchName=my-branch-test-8    -DscmBranchCommitComment=拉取测试分支  -Dusername=dray  -Dpassword=******  -DupdateBranchVersions=true  -DupdateWor
    kingCopyVersions=false

    我们分析一下上述命令

    -DbranchName 指定了需要创建新分支的名称

    -DscmBranchCommitComment 分支提交说明

    -DupdateBranchVersions 新的分支是否要基于原分支增加版本号,即原分支版本号加一,默认是false,即不会增加

    -DupdateWorkingCopyVersions 本地分支是否需要增加版本号,此处注意,默认是true开启,他会在新拉出的分支版本号加一

    我们总结一下,比如原分支版本为1.2.0-SNAPSHOT

    -DupdateBranchVersions开启,-DupdateWorkingCopyVersions关闭,则原分支版本号1.2.0-SNAPSHOT,新分支版本号为1.2.1-SNAPSHOT

    -DupdateBranchVersions开启,-DupdateWorkingCopyVersions开启,则原分支版本号1.2.2-SNAPSHOT,新分支版本号为1.2.1-SNAPSHOT

    -DupdateBranchVersions关闭,-DupdateWorkingCopyVersions开启,则原分支版本号1.2.1-SNAPSHOT,新分支版本号为1.2.0-SNAPSHOT

    -DupdateBranchVersions关闭,-DupdateWorkingCopyVersions关闭,则原分支版本号1.2.0-SNAPSHOT,新分支版本号为1.2.0-SNAPSHOT

    除了利用它的自增功能,我们也可以指定-DdevelopmentVersion=1.2.0-SNAPSHOT的方式来对新分支进行版本控制,当然仅当updateWorkingCopyVersions = true时,此参数才有意义

    好了,利用好release,再也不需要开发去手动修改pom然后提交啦,一切都可以自动化起来,是不是感觉原来世界这么美好

     

    展开全文
  • spring-framework-3.0.5.RELEASE-dependencies.zip

    千次下载 热门讨论 2014-06-18 09:25:51
    spring-framework-3.1.0.RELEASE-with-docs.zip下载依赖包:spring-framework-3.0.5.RELEASE-dependencies.zip
  • springsource-tool-suite-3.7.3.RELEASE-e4.5.2-updatesite.zip eclipse4.5.2 开发spring 的 插件 只能适用于eclipse4.5.2 官网提供下载 MD5 校验值:21e0c45a46b019fb8a5d932daa1cb9a7
  • spring-framework-4.0.0.RELEASE 完整包

    千次下载 热门讨论 2013-12-20 12:55:05
    spring-framework-4.0.0.RELEASE 完整包
  • spring-tool-suite-3.7.0.RELEASE-e4.5-win32-x86_64.zip

    千次下载 热门讨论 2015-07-13 17:09:23
    spring-tool-suite-3.7.0.RELEASE-e4.5-win32-x86_64.zip的下载地址 本来就是免费的,不要分
  • Debug 和 Release 编译方式

    千次阅读 2018-11-18 22:41:42
    Debug 和 Release 编译方式的区别本文主要包含如下内容: 1. Debug 和 Release 编译方式的本质区别 2. 哪些情况下 Release 版会出错 3. 怎样“调试” Release 版的程序 Debug 和 Release 编译方式的本质区别  Debug...
  • Eclipes Juno Service Release 2汉化包

    热门讨论 2013-04-02 14:40:49
    安卓和java共用的eclipse开发工具,汉化后开发更快捷
  • Source Release和Binary Release的区别

    千次阅读 2019-07-28 20:10:48
    本文为StackOverflow上回答的翻译,原文地址:...Source Release需要在你的机器上编译,Binary Release则必须匹配你的操作系统。 Source Release在Linux...
  • 我们很多情况下是需要在Release模式下调试QT程序的,如联合dmp文件输出崩溃信息辅助定位问题、引用第三方库没有Debug版本但是有需要单步调试程序等等。本文将介绍QT如何在Release模式下调试程序。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,427,539
精华内容 571,015
关键字:

release