一个简单的博客

0%

PowerShell设置代理

  • 设置代理
1
netsh winhttp set proxy "127.0.0.1:1080"
  • 恢复默认
1
netsh winhttp reset proxy

注意要在管理员模式运行,不然提示权限不足。

命令行设置代理

  • 设置代理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#HTTP 代理设置:
set http_proxy=http://127.0.0.1:1080

set https_proxy=http://127.0.0.1:1080
# SOCKS5 代理设置:
set http_proxy=socks5://127.0.0.1:1080
set https_proxy=socks5://127.0.0.1:1080

# 如果有用户名密码
set http_proxy_user=user
set http_proxy_pass=pass

set https_proxy_user=user
set https_proxy_pass=pass

# 不走代理的IP
# set NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24


# Ubuntu 下命令为 export
# export http_proxy=http://127.0.0.1:1080
  • 恢复默认
1
2
3
4
# 恢复
set http_proxy=

set https_proxy=

使用.Net Core 2.2创建windows服务

我的环境

  • win 10 home
  • Visual Studio 2019 v16.1.3
  • 安装有.net core 2.2

创建项目


编辑项目文件

在 PropertyGroup 配置节 加入属性 <RuntimeIdentifier>win-x64</RuntimeIdentifier>

保存后,重新生成项目

在项目文件夹下,会有文件夹 bin\Debug\netcoreapp2.2\win-x64,里面包含了exe文件。

测试服务类的编写

安装nuget包

1
Install-Package System.ServiceProcess.ServiceController -Version 4.5.0

修改启动类 Programe.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.IO;
using System.ServiceProcess;

namespace TestService
{
class Program
{
static void Main(string[] args)
{
using (var service = new TestSevice())
{
ServiceBase.Run(service);
}
}
}

internal class TestSevice : ServiceBase
{
public TestSevice()
{
ServiceName = "TestService";
}

protected override void OnStart(string[] args)
{
string filename = CheckFileExists();
File.AppendAllText(filename, $"{DateTime.Now} started.{Environment.NewLine}");
}

protected override void OnStop()
{
string filename = CheckFileExists();
File.AppendAllText(filename, $"{DateTime.Now} stopped.{Environment.NewLine}");
}

private static string CheckFileExists()
{
string filename = System.AppDomain.CurrentDomain.BaseDirectory + @"\MyService.txt";
if (!File.Exists(filename))
{
File.Create(filename);
}

return filename;
}

}
}

服务安装、启动、卸载

安装

sc create testservice binpath=D:\source\repos\TestConsoleService\TestService\bin\Debug\netcoreapp2.2\win-x64\TestService.exe

必须以管理员身份运行命令提示符

卸载

sc delete testservice

启动

不能通过命令行启动服务

sc start testservice

只能去服务管理器使用鼠标启动服务,具体原因暂未研究

反复启动停止,然后去exe所在目录下查看MyService.txt的内容,确认服务的启动。

参考文档

安装

本文未完成全部,暂时挂起中

Docker on Windows

1
2
3
4
docker run -u root --rm -d -p 8080:8080 -p 50000:50000 --name jenkins-test -v jenkins-data:/var/jenkins_home  -v /var/run/docker.sock:/var/run/docker.sock  jenkinsci/blueocean

### 控制台日志和访问 docker logs <docker-container-name>
### 访问Jenkins/BlueOcean Docker容器 docker exec -it <docker-container-name> bash

选项解释

  • –rm (可选) jenkinsci/blueocean 关闭时自动删除Docker容器(下图为实例)。如果您需要退出Jenkins,这可以保持整洁。

  • -d (可选)jenkinsci/blueocean 在后台运行容器(即“分离”模式)并输出容器ID。如果您不指定此选项, 则在终端窗口中输出正在运行的此容器的Docker日志。

  • -p 8080:8080 映射(例如“发布”)jenkinsci/blueocean 容器的端口8080到主机上的端口8080。 第一个数字代表主机上的端口,而最后一个代表容器的端口。因此,如果您为此选项指定 -p 49000:8080 ,您将通过端口49000访问主机上的Jenkins。

    (可选)将 jenkinsci/blueocean 容器的端口50000 映射到主机上的端口50000。 如果您在其他机器上设置了一个或多个基于JNLP的Jenkins代理程序,而这些代理程序又与 jenkinsci/blueocean 容器交互(充当“主”Jenkins服务器,或者简称为“Jenkins主”), 则这是必需的。默认情况下,基于JNLP的Jenkins代理通过TCP端口50000与Jenkins

  • -v (可选,但强烈建议)映射在容器中的/var/jenkins_home 目录到具有名字 jenkins-data 的volume。 如果这个卷不存在,那么这个 docker run 命令会自动为你创建卷。 如果您希望每次重新启动Jenkins(通过此 docker run … 命令)时保持Jenkins状态,则此选项是必需的 。 如果你没有指定这个选项,那么在每次重新启动后,Jenkins将有效地重置为新的实例。

    注意: 所述的 jenkins-data 卷也可以 docker volume create命令创建: docker volume create jenkins-data 代替映射 /var/jenkins_home 目录转换为Docker卷,还 可以将此目录映射到计算机本地文件系统上的目录。 例如,指定该选项 -v $HOME/jenkins:/var/jenkins_home 会将容器的 /var/jenkins_home 目录映射 到 本地计算机上目录中的 jenkins 子目录, 该$HOME目录通常是 /Users//jenkins 或/home/<your-username>/jenkins

  • 可选 /var/run/docker.sock 表示Docker守护程序通过其监听的基于Unix的套接字。 该映射允许 jenkinsci/blueocean 容器与Docker守护进程通信, 如果 jenkinsci/blueocean 容器需要实例化其他Docker容器,则该守护进程是必需的。 如果运行声明式管道,其语法包含agent部分用 docker

    例如, agent { docker { … } } 此选项是必需的。 在Pipeline Syntax 页面上阅读更多关于这个的信息 。

    jenkinsci/blueocean Docker镜像本身。如果此镜像尚未下载,则此 docker run 命令 将自动为您下载镜像。此外,如果自上次运行此命令后发布了此镜像的任何更新, 则再次运行此命令将自动为您下载这些已发布的镜像更新。 注意:这个Docker镜像也可以使用以下 docker pull命令独立下载(或更新) : docker pull jenkinsci/blueocean 注意: 如果复制并粘贴上面的命令片段不起作用,请尝试在此处复制并粘贴此无注释版本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    docker run ^
    -u root ^
    --rm ^
    -d ^
    -p 8080:8080 ^
    -p 50000:50000 ^
    -v jenkins-data:/var/jenkins_home ^
    -v /var/run/docker.sock:/var/run/docker.sock ^
    jenkinsci/blueocean
    --name jenkins-blueocean

Windows安装使用

原文地址

1. 问题简介

最近产品发布大版本补丁更新,一商超客户升级后,反馈系统经常奔溃,导致超市的收银系统无法正常收银,现场排队付款的顾客更是抱怨声声。为了缓解现场的情况, 客户都是手动回收IIS应用程序池才能解决。

现场排队情况

这样的后果是很严重的,接到反馈,第一时间想到的是加内存吧,这样最快。但是客户从8G–>16G–>32G,只是延长了每次奔溃的时间,但是并没有解决系统卡顿的问题。到这里,也基本猜测了问题所在了,肯定是什么东西一直在吃内存且得不到释放。这种问题,也就只能打Dump分析了。

2. 打Dump

远程客户应用服务器,32G内存占用已经消耗了78%,而现场已经反馈收银系统接近奔溃了,要求先强制回收内存。反正也要奔溃了,先打Dump再说吧。

(PS:打Dump会挂起进程,导致应用无法响应!而打Dump的耗时,也是根据当时进程的内存占用有关,内存占用越大,耗时越久。)

打开任务管理器,选择对应的IIS进程,右键创建转储文件(Dump)。

打Dump

结果,Dump文件是生成的,结果当分析的时候,发现Windbg提示Dump无效。说明Dump文件创建的有问题。观察任务管理器,发现内存占用一下就降下来了,原来是之前的进程直接奔溃了,重启了一个W3WP进程。

既然直接从任务管理器无法创建,就使用第三方工具收集Dump吧。经过Goggle,找到一款很好用的Dump收集工具ProcDump,是一个命令行应用,其主要用途是监视应用程序的CPU或内存峰值并在峰值期间生成Dump。

因为是高内存占用问题,我们使用以下命令来抓取dump:

(PS:可以使用进程名称,也可以使用进程ID来指定要创建Dump的进程。当有多个相同名称的进程时,必须使用进程ID来指定!)

procdump w3wp -m 20480 -o D:\Dumps (当内存超过20G时抓取一个w3wp进程的MiniDump)

上面就是我踩得第一个坑,因为默认抓取的是MiniDump,很快就抓下来,文件也很小,正在我得意的时候,Windbg加载Dump分析的时候,发现包含的信息很少,根本无法进行进一步的分析。

调整创建Dump的命令,添加-ma参数即可创建完整Dump。

procdump w3wp -ma -m 20480 -o D:\Dumps (当内存超过20G时抓取一个w3wp进程的完整Dump)

结果再一次,当内存占用到达20G,占比80%的时候,Dump再次创建失败,提示:Procdump Error writing dump file。再一次感觉到绝望。不过至少有错误提示,Google一把,果然存在天涯沦落人。Procdump Error writing dump file: 0x80070005 Error 0x80070005 (-2147024891): Access is denied。大致的意思是说,当90S内Dump文件没有成功创建的话(也就意外这w3wp进程被挂起了90s),IIS检测到w3wp进程挂起超过90s没有响应就会终止进程,重现创建一个新的进程。好嘛,真是处处是坑。

这个坑,也让我开始真正停下来思考问题。罗马不是一日建成的,内存也不是一下撑爆的。我干嘛死脑筋非要到内存占用超过80%才去打Dump呢呢呢???!

焕然大悟,如醍醐灌顶。

procdump w3wp -ma -m 8000 -o D:\Dumps (当内存超过8000M时抓取一个w3wp进程的完整Dump,并输出到D:\Dumps文件夹)

此时内存占用在40%左右,这次Dump终于成功创建了。

3..分析Dump

分析Dump,上WinDbg。如果对WinDbg不理解,可以看我这篇WinDbg学习笔记

接下来就是一通命令乱敲,我尽量解释清晰。

0:000&gt; !dumpheap -stat //检查当前所有托管类型的统计信息
....
00007ffdb9387a98   777101     69462436 System.Char[]
00007ffdb938c988   588917    115563505 System.Byte[]
00007ffdb9389220  1026406    119828936 System.Int32[]
00007ffdb93516a8   663559    128819040 System.Collections.Generic.Dictionary`2+Entry[<span class="hljs-string">[System.String, mscorlib</span>],[<span class="hljs-string">System.Object, mscorlib</span>]][]
00000218c6c30a80  6436865    197832116      Free
00007ffdae9cc240    23171    273333144 System.Collections.Generic.HashSet`1+Slot[<span class="hljs-string">[System.String, mscorlib</span>]][]
00007ffdb9391f28 13885170    333244080 System.Boolean
00007ffd5c24a068 14003455    560138200 Kingdee.BOS.JSON.JSONArray
00007ffdb9386fc0 14373648   1393615400 System.Object[]
00007ffdb9386948 76146065   4000287202 System.String
Total 138435970 objects`</pre>

使用`dumpheap -stat`命令查看当前所有托管类型的统计信息。从输出的结果来看:
  1. 其中占用内存最多当属System.String类型,接近4G的大小(是不是很吃惊?!)。

  2. 其次System.Object[]类型占有1.3G大小。

  3. Kingdee.BOS.JSON.JSONArray类型也大概占用了560M。

    我们首先来分析占用最多的System.String类型,看看有什么发现。

    `0:000> !dumpheap -mt 00007ffdb9386948 -min 200 //查看200byte以上的string
    Address               MT     Size
    ...
    0000021bcbaf5158 00007ffdb9386948     1140
    0000021d375d1038 00007ffdb9386948   149698     
    0000021d375f5920 00007ffdb9386948   149698     
    0000021d3765b138 00007ffdb9386948   149706     
    0000021d37f739c8 00007ffdb9386948   217120     
    0000021d37fa8a08 00007ffdb9386948   190162     
    0000021d38047330 00007ffdb9386948  1224698     
    0000021d3829d348 00007ffdb9386948  1224698     
    0000021d386bd678 00007ffdb9386948  2610994     
    0000021d38bb8500 00007ffdb9386948  2610994     
    
    Statistics:
                  MT    Count    TotalSize Class Name
    00007ffdb9386948    10991     76632628 System.String
    Total 10991 objects`

    从上面的输出可以发现:

  4. 单个System.String类型最大占用2M以上。

  5. 超过200byte的字节的大小的System.String总大小也不过76M。(所以我们也不必深究大的String对象。)

    那我们索性挑一个小点的对象来看看存储的是什么字符串,来满足一下我们的好奇心。

    `0.000> !do 0000021bcbaf5158 //使用!do命令查看一个对象的内容
    Name:        System.String
    MethodTable: 00007ffdb9386948
    EEClass:     00007ffdb8c850e0
    Size:        1140(0x474) bytes
    File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
    String:      5b13710029d012False2052_T_BD_MATERIAL_MATERIAL.FAuxPropertyIdFBaseUnitIdFCategoryIDFChargeIDFCheckIncomingFDefaultVendorFErpClsIDFInvPtyIdFIsAffectPlanFIsAffectPlan1FIsBatchManageFIsComControlFIsEnableFIsEnable1FIsExpParToFlotFIsInventoryFIsPRFIsReturnMaterialFIsSourceControlFIsVmiBusinessFNameFNumberFPlanModeFPurchasePriceUnitIdFPurchaseUnitIdFPurPriceURNomFPurPriceURNumFPurURNomFPurURNumFReceiveAdvanceDaysFReceiveDelayDaysFReceiveMaxScaleFReceiveMinScaleFSalePriceUnitIdFSaleUnitIdFSpecificationFStockIdFStockPlaceIdFStoreUnitIDFTaxTypeFUseOrgId111193
    Fields:
                  MT    Field   Offset                 Type VT     Attr            Value Name
    00007ffdb9389288  400026f        8         System.Int32  1 instance              557 m_stringLength
    00007ffdb9387b00  4000270        c          System.Char  1 instance               35 m_firstChar
    00007ffdb9386948  4000274       90        System.String  0   shared           static Empty
                                     >> Domain:Value  00000218c6c4d220:NotInit  0000021d52d81840:NotInit  <<`

    似乎是基础资料字段信息。那接下来使用!gcroot命令查看其对应的GC根,看看到底是什么对象持有其引用,导致占用内存得不到释放。

    `0:000> !gcroot 0000021bcbaf5158 //使用!gcroot 查看一个对象的gc根
    HandleTable:
        00000218c6ff15e8 (pinned handle)
        -> 0000021cc75ebe68 System.Object[]
        -> 0000021bc7629a10 Kingdee.BOS.Cache.KCacheManagerFactory
        -> 0000021bc7629ab8 System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[Kingdee.BOS.Cache.AbstractKCacheManager, Kingdee.BOS]]
        -> 0000021c4da6fa48 System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[Kingdee.BOS.Cache.AbstractKCacheManager, Kingdee.BOS]][]
        -> 00000218c83861b8 Kingdee.BOS.Cache.KCacheManager
        -> 00000218c8386630 Kingdee.BOS.Cache.ECache.ECacheManager
        -> 00000218c83866e8 System.Collections.Concurrent.ConcurrentDictionary`2[[System.String, mscorlib],[System.Collections.Generic.HashSet`1[[System.String, mscorlib]], System.Core]]
        -> 0000021bcbae0c70 System.Collections.Concurrent.ConcurrentDictionary`2+Tables[[System.String, mscorlib],[System.Collections.Generic.HashSet`1[[System.String, mscorlib]], System.Core]]
        -> 0000021bcbad0128 System.Collections.Concurrent.ConcurrentDictionary`2+Node[[System.String, mscorlib],[System.Collections.Generic.HashSet`1[[System.String, mscorlib]], System.Core]][]
        -> 0000021bcbb34bf8 System.Collections.Concurrent.ConcurrentDictionary`2+Node[[System.String, mscorlib],[System.Collections.Generic.HashSet`1[[System.String, mscorlib]], System.Core]]
        -> 0000021bcbada790 System.Collections.Concurrent.ConcurrentDictionary`2+Node[[System.String, mscorlib],[System.Collections.Generic.HashSet`1[[System.String, mscorlib]], System.Core]]
        -> 0000021a49766460 System.Collections.Generic.HashSet`1[[System.String, mscorlib]]
        -> 00000219540976b0 System.Collections.Generic.HashSet`1+Slot[[System.String, mscorlib]][]
        -> 0000021bcbaf5158 System.String
    
    Found 1 unique roots (run '!GCRoot -all' to see all roots).`

    从以上输出可以看出:

  6. 该String类型被一个Hashset所持有。

  7. Cache关键字可以看出该String类型是被缓存所持有。

    分析到这里,我们大致可以得出一个结论:

    String类型占用4G内存,绝大多数是由缓存所占用,才导致String类型得不到释放。

    那我们是不是可以猜测内存占用持续走高是不是被缓存撑爆的呢?

    带着这个疑问我们来继续分析下Kingdee.BOS.JSON.JSONArray类型。

    `0:000> !dumpheap -mt 00007ffd5c24a068 //输出托管堆上的所有JSONArray对象
             Address               MT     Size
    ....
    0000021975972b48 00007ffd5c24a068       40     
    00000218c933f060 00007ffd5c24a068       40     
    00000218c7605990 00007ffd5c24a068       40     
    00000218c7605af0 00007ffd5c24a068       40     
    00000218c7605c50 00007ffd5c24a068       40     
    00000218c7605e18 00007ffd5c24a068       40     
    00000218c7605fa0 00007ffd5c24a068       40     
    00000218c7606198 00007ffd5c24a068       40     
    00000218c7606338 00007ffd5c24a068       40     
    00000218c76064b0 00007ffd5c24a068       40     
    User interrupt.`

    从输出结果来看:

  8. 满屏都是40byte的JSONArray。只能使用Ctrl+Break命令中止输出。

    但为了保险期间,我们来验证下有没有100byte以上的JSONArray

    `0:000> !dumpheap -mt 00007ffd5c24a068 -min 100
             Address               MT     Size
    
    Statistics:
                  MT    Count    TotalSize Class Name
    Total 0 objects`

    这时我们可以大胆猜测所有的JSONArray对象都是40byte。从而可以得出另一个猜测占用560M内存的JSONArray,都具有相似的对象结构。接下来我们来验证这个猜测。随机选择几个对象,看看其内容具体是什么。

    `0:000> !DumpObj /d 0000021975972b48  //查看第一个JSONArray
    Name:        System.Object[]
    MethodTable: 00007ffdb9386fc0
    EEClass:     00007ffdb8d4aa00
    Size:        88(0x58) bytes
    Array:       Rank 1, Number of elements 8, Type CLASS (Print Array)
    Fields:
    None`

    从输出可以看出:

  9. JSONArray实质是System.Object[]类型。

  10. 对应的MethodTable: 00007ffdb9386fc0

    如果你记性好的话,我们应当还记得占用内存第二多的就是这个System.Object[]类型,占用1.3G。翻到上面,你可以发现其MethodTable和上面的统计信息是一致的。

    (PS:到这里我们是不是可以猜测:System.Object[]占用的内存无法释放,就是由于被JSONArray持有引用导致的呢?

    既然是数组,就使用!DumpArray 命令来解开数组的面纱。

    `0:000> !DumpArray /d 0000021975972b48 
    Name:        System.Object[]
    MethodTable: 00007ffdb9386fc0
    EEClass:     00007ffdb8d4aa00
    Size:        88(0x58) bytes
    Array:       Rank 1, Number of elements 8, Type CLASS
    Element Methodtable: 00007ffdb9386f28
    [0] 0000021975972a08
    [1] 0000021975972a70
    [2] 0000021975972a40
    [3] 0000021ac75e87b8
    [4] 0000021975972b10
    [5] 0000021975972ba0
    [6] null
    [7] null
    0:000> !DumpObj /d 0000021975972a08
    Name:        System.String
    MethodTable: 00007ffdb9386948
    EEClass:     00007ffdb8c850e0
    Size:        54(0x36) bytes
    File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
    String:      555d8ca25a6261
    Fields:7
                  MT    Field   Offset                 Type VT     Attr            Value Name
    00007ffdb9389288  400026f        8         System.Int32  1 instance               14 m_stringLength
    00007ffdb9387b00  4000270        c          System.Char  1 instance               35 m_firstChar
    00007ffdb9386948  4000274       90        System.String  0   shared           static Empty
                                     >> Domain:Value  00000218c6c4d220:NotInit  0000021d52d81840:NotInit  <<`

    从以上输出可以看出,其共有8个子项,我们再随机挑几个子项看看是什么内容。

    `0:000> !DumpObj /d 0000021975972a70
    Name:        System.String
    MethodTable: 00007ffdb9386948
    EEClass:     00007ffdb8c850e0
    Size:        42(0x2a) bytes
    File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
    String:      FHTZDLB
    Fields:
                  MT    Field   Offset                 Type VT     Attr            Value Name
    00007ffdb9389288  400026f        8         System.Int32  1 instance                8 m_stringLength
    00007ffdb9387b00  4000270        c          System.Char  1 instance               50 m_firstChar
    00007ffdb9386948  4000274       90        System.String  0   shared           static Empty
                                     >> Domain:Value  00000218c6c4d220:NotInit  0000021d52d81840:NotInit  <<
    0:000> !DumpObj /d 0000021975972a40
    Name:        System.String
    MethodTable: 00007ffdb9386948
    EEClass:     00007ffdb8c850e0
    Size:        42(0x2a) bytes
    File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
    String:      发货通知单列表
    Fields:
                  MT    Field   Offset                 Type VT     Attr            Value Name
    00007ffdb9389288  400026f        8         System.Int32  1 instance                8 m_stringLength
    00007ffdb9387b00  4000270        c          System.Char  1 instance             6279 m_firstChar
    00007ffdb9386948  4000274       90        System.String  0   shared           static Empty
                                     >> Domain:Value  00000218c6c4d220:NotInit  0000021d52d81840:NotInit  <<`

    我们可以看到一个字符串内容是FHTZDLB,另一个是发货通知单列表。看到这,我立马就条件反射的想到,这不就是我们的菜单信息嘛。为了验证我的想法,连续查看几个JSONArray,都是相似的内容。

    这时,我们继续发扬敢猜敢做的精神。是不是内存被菜单缓存撑爆的?!

    为了验证这一猜测,我们继续从Dump中寻找佐证。使用~* e!clrstack来看看所有线程的调用堆栈吧。

    `0:000> ~* e!clrstack
    OS Thread Id: 0x11dc (0)
    Unable to walk the managed stack. The current thread is likely not a 
    managed thread. You can run !threads to get a list of managed threads in
    the process
    Failed to start stack walk: 80070057
    OS Thread Id: 0x2b2c (28)
            Child SP               IP Call Site
    00000076cff7ecc8 00007ffdca2e6bf4 [HelperMethodFrame_1OBJ: 00000076cff7ecc8] System.Threading.WaitHandle.WaitMultiple(System.Threading.WaitHandle[], Int32, Boolean, Boolean)
    00000076cff7ee00 00007ffdb91af67c System.Threading.WaitHandle.WaitAny(System.Threading.WaitHandle[], Int32, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\waithandle.cs @ 454]
    00000076cff7ee60 00007ffdb201b2fb System.Net.TimerThread.ThreadProc()
    00000076cff7ef10 00007ffdb915ca72 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ 954]
    00000076cff7efe0 00007ffdb915c904 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ 902]
    00000076cff7f010 00007ffdb915c8c2 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ 891]
    00000076cff7f060 00007ffdb9196472 System.Threading.ThreadHelper.ThreadStart() [f:\dd\ndp\clr\src\BCL\system\threading\thread.cs @ 111]
    00000076cff7f2b8 00007ffdbb4f6793 [GCFrame: 00000076cff7f2b8] 
    00000076cff7f608 00007ffdbb4f6793 [DebuggerU2MCatchHandlerFrame: 00000076cff7f608] 
    00000076cff7f798 00007ffdbb4f6793 [ContextTransitionFrame: 00000076cff7f798] 
    00000076cff7f9c8 00007ffdbb4f6793 [DebuggerU2MCatchHandlerFrame: 00000076cff7f9c8] 
    
    OS Thread Id: 0x1bd4 (133)
            Child SP               IP Call Site
    GetFrameContext failed: 1
    0000000000000000 0000000000000000 
    OS Thread Id: 0x1a98 (134)
            Child SP               IP Call Site
    00000076dbdbcc88 00007ffdca2e6124 [InlinedCallFrame: 00000076dbdbcc88] .SNIReadSyncOverAsync(SNI_ConnWrapper*, SNI_Packet**, Int32)
    00000076dbdbcc88 00007ffdaaaf5dd4 [InlinedCallFrame: 00000076dbdbcc88] .SNIReadSyncOverAsync(SNI_ConnWrapper*, SNI_Packet**, Int32)
    00000076dbdbcc60 00007ffdaaaf5dd4 DomainNeutralILStubClass.IL_STUB_PInvoke(SNI_ConnWrapper*, SNI_Packet**, Int32)
    00000076dbdbcd10 00007ffdaab08fe3 SNINativeMethodWrapper.SNIReadSyncOverAsync(System.Runtime.InteropServices.SafeHandle, IntPtr ByRef, Int32)
    00000076dbdbcd70 00007ffdaabe0ae0 System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
    00000076dbdbcdd0 00007ffdaabe09dd System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
    00000076dbdbce10 00007ffdaabdf7f5 System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
    00000076dbdbce50 00007ffdaabdfa0e System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte ByRef)
    00000076dbdbce90 00007ffdaabc7daa System.Data.SqlClient.TdsParser.TryRun(System.Data.SqlClient.RunBehavior, System.Data.SqlClient.SqlCommand, System.Data.SqlClient.SqlDataReader, System.Data.SqlClient.BulkCopySimpleResultSet, System.Data.SqlClient.TdsParserStateObject, Boolean ByRef)
    00000076dbdbcff0 00007ffdaabbb3c7 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
    00000076dbdbd050 00007ffdaabb8325 System.Data.SqlClient.SqlDataReader.get_MetaData()
    00000076dbdbd0a0 00007ffdaab3be73 System.Data.SqlClient.SqlCommand.FinishExecuteReader(System.Data.SqlClient.SqlDataReader, System.Data.SqlClient.RunBehavior, System.String, Boolean, Boolean)
    00000076dbdbd110 00007ffdaab3b75f System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, Boolean, Int32, System.Threading.Tasks.Task ByRef, Boolean, Boolean, System.Data.SqlClient.SqlDataReader, Boolean)
    00000076dbdbd1f0 00007ffdaab3a763 System.Data.SqlClient.SqlCommand.RunExecuteReader(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, System.String, System.Threading.Tasks.TaskCompletionSource`1, Int32, System.Threading.Tasks.Task ByRef, Boolean ByRef, Boolean, Boolean)
    00000076dbdbd2c0 00007ffdaab3a49b System.Data.SqlClient.SqlCommand.RunExecuteReader(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, System.String)
    00000076dbdbd360 00007ffdaab35cc6 System.Data.SqlClient.SqlCommand.ExecuteReader(System.Data.CommandBehavior, System.String)
    00000076dbdbd3f0 00007ffd5c517ead Kingdee.BOS.App.Data.AbstractDatabase.DoExecuteReader(System.Data.Common.DbCommand, System.Data.CommandBehavior)
    00000076dbdbd450 00007ffd5c515ebb Kingdee.BOS.App.Data.AbstractDatabase.ExecuteReader(System.Data.Common.DbCommand, System.Collections.Generic.IEnumerable`1, System.Data.CommandBehavior, Boolean)
    00000076dbdbd4d0 00007ffd5c4fd6f2 Kingdee.BOS.App.Data.AbstractDatabase.ExecuteReader(System.Data.Common.DbCommand, System.Collections.Generic.IEnumerable`1, System.Data.CommandBehavior)
    00000076dbdbd500 00007ffd5c4e31b1 Kingdee.BOS.App.Data.DBUtils.ExecuteReader(Kingdee.BOS.Context, System.String, System.Collections.Generic.IEnumerable`1, System.Data.CommandType, System.Data.CommandBehavior, Boolean)
    00000076dbdbd570 00007ffd5c51d2a7 Kingdee.BOS.App.Data.DBUtils.ExecuteReader(Kingdee.BOS.Context, System.String, System.Collections.Generic.IEnumerable`1, System.Data.CommandType, Boolean)
    00000076dbdbd5b0 00007ffd5c51d2fc Kingdee.BOS.App.Data.DBUtils.ExecuteReader(Kingdee.BOS.Context, System.String, System.Data.CommandType, Boolean)
    00000076dbdbd5e0 00007ffd5c51d341 Kingdee.BOS.App.Data.DBUtils.ExecuteReader(Kingdee.BOS.Context, System.String)
    00000076dbdbd610 00007ffd5ca5a5d4 Kingdee.BOS.App.Core.MainConsole.MainConsoleServer.GetSearchMenuData(Kingdee.BOS.Context, System.String, System.Collections.Generic.HashSet`1 ByRef, System.Collections.Generic.HashSet`1 ByRef)
    00000076dbdbd7d0 00007ffd5ca58164 Kingdee.BOS.App.Core.MainConsole.MainConsoleServer.GetMenuArrayForCache(Kingdee.BOS.Context)
    00000076dbdbda78 00007ffdbb4f6793 [DebuggerU2MCatchHandlerFrame: 00000076dbdbda78] 
    00000076dbdbddb8 00007ffdbb4f6793 [HelperMethodFrame_PROTECTOBJ: 00000076dbdbddb8] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean)
    00000076dbdbdf30 00007ffdb914b690 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[]) [f:\dd\ndp\clr\src\BCL\system\reflection\methodinfo.cs @ 761]
    00000076dbdbdfa0 00007ffdb9142922 System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) [f:\dd\ndp\clr\src\BCL\system\reflection\methodinfo.cs @ 735]
    00000076dbdbe020 00007ffdb9143f22 System.Reflection.MethodBase.Invoke(System.Object, System.Object[]) [f:\dd\ndp\clr\src\BCL\system\reflection\methodbase.cs @ 211]
    00000076dbdbe060 00007ffd5c61990c Microsoft.Practices.Unity.InterceptionExtension.InterceptingRealProxy+c__DisplayClass1.b__0(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextInterceptionBehaviorDelegate)
    00000076dbdbe160 00007ffd5c619477 Microsoft.Practices.Unity.InterceptionExtension.PolicyInjectionBehavior+c__DisplayClass1.b__0(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextHandlerDelegate)
    00000076dbdbe200 00007ffd5c61cbc4 Kingdee.BOS.Cache.KCacheMethodCallHandler.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextHandlerDelegate)
    00000076dbdbe350 00007ffd5c61b10b Kingdee.BOS.Performance.Publisher.PerformanceCallHandler.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextHandlerDelegate)
    00000076dbdbe3e0 00007ffd5c61b10b Kingdee.BOS.Performance.Publisher.PerformanceCallHandler.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextHandlerDelegate)
    00000076dbdbe470 00007ffd5c61b10b Kingdee.BOS.Performance.Publisher.PerformanceCallHandler.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextHandlerDelegate)
    00000076dbdbe500 00007ffd5c61936d Microsoft.Practices.Unity.InterceptionExtension.HandlerPipeline.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.InvokeHandlerDelegate)
    00000076dbdbe590 00007ffd5c618999 Microsoft.Practices.Unity.InterceptionExtension.PolicyInjectionBehavior.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextInterceptionBehaviorDelegate)
    00000076dbdbe620 00007ffd5c61845d Microsoft.Practices.Unity.InterceptionExtension.InterceptionBehaviorPipeline.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.InvokeInterceptionBehaviorDelegate)
    00000076dbdbe6b0 00007ffd5c617002 Microsoft.Practices.Unity.InterceptionExtension.InterceptingRealProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage)
    00000076dbdbe790 00007ffdb911190c System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(System.Runtime.Remoting.Proxies.MessageData ByRef, Int32) [f:\dd\ndp\clr\src\BCL\system\runtime\remoting\realproxy.cs @ 823]
    00000076dbdbe980 00007ffdbb4f4a02 [TPMethodFrame: 00000076dbdbe980] Kingdee.BOS.Contracts.IMainConsoleServer.GetMenuArrayForCache(Kingdee.BOS.Context)
    00000076dbdbec00 00007ffdb91ad436 System.Threading.Tasks.Task.Execute() [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2498]
    00000076dbdbec40 00007ffdb915ca72 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ 954]
    00000076dbdbed10 00007ffdb915c904 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ 902]
    00000076dbdbed40 00007ffdb91ad6dc System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2827]
    00000076dbdbedf0 00007ffdb91acdf3 System.Threading.Tasks.Task.ExecuteEntry(Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2767]
    00000076dbdbee30 00007ffdb9194882 System.Threading.ThreadPoolWorkQueue.Dispatch() [f:\dd\ndp\clr\src\BCL\system\threading\threadpool.cs @ 820]
    00000076dbdbf2c8 00007ffdbb4f6793 [DebuggerU2MCatchHandlerFrame: 00000076dbdbf2c8] 
    00000076dbdbf458 00007ffdbb4f6793 [ContextTransitionFrame: 00000076dbdbf458] 
    00000076dbdbf688 00007ffdbb4f6793 [DebuggerU2MCatchHandlerFrame: 00000076dbdbf688] 
    OS Thread Id: 0x153c (135)
            Child SP               IP Call Site
    GetFrameContext failed: 1
    0000000000000000 0000000000000000 
    OS Thread Id: 0x242c (136)
            Child SP               IP Call Site
    GetFrameContext failed: 1
    0000000000000000 0000000000000000 
    OS Thread Id: 0x153c (135)
            Child SP               IP Call Site
    GetFrameContext failed: 1
    0000000000000000 0000000000000000 
    OS Thread Id: 0x242c (136)
            Child SP               IP Call Site
    GetFrameContext failed: 1
    0000000000000000 0000000000000000 
    OS Thread Id: 0x2a04 (137)
            Child SP               IP Call Site
    00000076dbf7af08 00007ffdca2e6124 [InlinedCallFrame: 00000076dbf7af08] .SNIReadSyncOverAsync(SNI_ConnWrapper*, SNI_Packet**, Int32)
    00000076dbf7af08 00007ffdaaaf5dd4 [InlinedCallFrame: 00000076dbf7af08] .SNIReadSyncOverAsync(SNI_ConnWrapper*, SNI_Packet**, Int32)
    00000076dbf7aee0 00007ffdaaaf5dd4 DomainNeutralILStubClass.IL_STUB_PInvoke(SNI_ConnWrapper*, SNI_Packet**, Int32)
    00000076dbf7af90 00007ffdaab08fe3 SNINativeMethodWrapper.SNIReadSyncOverAsync(System.Runtime.InteropServices.SafeHandle, IntPtr ByRef, Int32)
    00000076dbf7aff0 00007ffdaabe0ae0 System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
    00000076dbf7b050 00007ffdaabe09dd System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
    00000076dbf7b090 00007ffdaabdf7f5 System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
    00000076dbf7b0d0 00007ffdaabdfa0e System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte ByRef)
    00000076dbf7b110 00007ffdaabc7daa System.Data.SqlClient.TdsParser.TryRun(System.Data.SqlClient.RunBehavior, System.Data.SqlClient.SqlCommand, System.Data.SqlClient.SqlDataReader, System.Data.SqlClient.BulkCopySimpleResultSet, System.Data.SqlClient.TdsParserStateObject, Boolean ByRef)
    00000076dbf7b270 00007ffdaabbb3c7 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
    00000076dbf7b2d0 00007ffdaabb8325 System.Data.SqlClient.SqlDataReader.get_MetaData()
    00000076dbf7b320 00007ffdaab3be73 System.Data.SqlClient.SqlCommand.FinishExecuteReader(System.Data.SqlClient.SqlDataReader, System.Data.SqlClient.RunBehavior, System.String, Boolean, Boolean)
    00000076dbf7b390 00007ffdaab3b75f System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, Boolean, Int32, System.Threading.Tasks.Task ByRef, Boolean, Boolean, System.Data.SqlClient.SqlDataReader, Boolean)
    00000076dbf7b470 00007ffdaab3a763 System.Data.SqlClient.SqlCommand.RunExecuteReader(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, System.String, System.Threading.Tasks.TaskCompletionSource`1, Int32, System.Threading.Tasks.Task ByRef, Boolean ByRef, Boolean, Boolean)
    00000076dbf7b540 00007ffdaab3a49b System.Data.SqlClient.SqlCommand.RunExecuteReader(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, System.String)
    00000076dbf7b5e0 00007ffdaab35cc6 System.Data.SqlClient.SqlCommand.ExecuteReader(System.Data.CommandBehavior, System.String)
    00000076dbf7b670 00007ffd5c517ead Kingdee.BOS.App.Data.AbstractDatabase.DoExecuteReader(System.Data.Common.DbCommand, System.Data.CommandBehavior)
    00000076dbf7b6d0 00007ffd5c515ebb Kingdee.BOS.App.Data.AbstractDatabase.ExecuteReader(System.Data.Common.DbCommand, System.Collections.Generic.IEnumerable`1, System.Data.CommandBehavior, Boolean)
    00000076dbf7b750 00007ffd5c4fd6f2 Kingdee.BOS.App.Data.AbstractDatabase.ExecuteReader(System.Data.Common.DbCommand, System.Collections.Generic.IEnumerable`1, System.Data.CommandBehavior)
    00000076dbf7b780 00007ffd5c4e31b1 Kingdee.BOS.App.Data.DBUtils.ExecuteReader(Kingdee.BOS.Context, System.String, System.Collections.Generic.IEnumerable`1, System.Data.CommandType, System.Data.CommandBehavior, Boolean)
    00000076dbf7b7f0 00007ffd5c51d2a7 Kingdee.BOS.App.Data.DBUtils.ExecuteReader(Kingdee.BOS.Context, System.String, System.Collections.Generic.IEnumerable`1, System.Data.CommandType, Boolean)
    00000076dbf7b830 00007ffd5c61737a Kingdee.BOS.App.Data.DBUtils.ExecuteReader(Kingdee.BOS.Context, System.String, System.Collections.Generic.List`1)
    00000076dbf7b860 00007ffd5c8d2bd7 Kingdee.BOS.App.Core.UserParameterService.GetParamter(Kingdee.BOS.Context, Int64, System.String, System.String)
    00000076dbf7bb68 00007ffdbb4f6793 [DebuggerU2MCatchHandlerFrame: 00000076dbf7bb68] 
    00000076dbf7bea8 00007ffdbb4f6793 [HelperMethodFrame_PROTECTOBJ: 00000076dbf7bea8] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean)
    00000076dbf7c020 00007ffdb914b690 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[]) [f:\dd\ndp\clr\src\BCL\system\reflection\methodinfo.cs @ 761]
    00000076dbf7c090 00007ffdb9142922 System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) [f:\dd\ndp\clr\src\BCL\system\reflection\methodinfo.cs @ 735]
    00000076dbf7c110 00007ffdb9143f22 System.Reflection.MethodBase.Invoke(System.Object, System.Object[]) [f:\dd\ndp\clr\src\BCL\system\reflection\methodbase.cs @ 211]
    00000076dbf7c150 00007ffd5c61990c Microsoft.Practices.Unity.InterceptionExtension.InterceptingRealProxy+c__DisplayClass1.b__0(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextInterceptionBehaviorDelegate)
    00000076dbf7c250 00007ffd5c619477 Microsoft.Practices.Unity.InterceptionExtension.PolicyInjectionBehavior+c__DisplayClass1.b__0(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextHandlerDelegate)
    00000076dbf7c2f0 00007ffd5c61cbc4 Kingdee.BOS.Cache.KCacheMethodCallHandler.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextHandlerDelegate)
    00000076dbf7c440 00007ffd5c61b10b Kingdee.BOS.Performance.Publisher.PerformanceCallHandler.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextHandlerDelegate)
    00000076dbf7c4d0 00007ffd5c61b10b Kingdee.BOS.Performance.Publisher.PerformanceCallHandler.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextHandlerDelegate)
    00000076dbf7c560 00007ffd5c61b10b Kingdee.BOS.Performance.Publisher.PerformanceCallHandler.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextHandlerDelegate)
    00000076dbf7c5f0 00007ffd5c61936d Microsoft.Practices.Unity.InterceptionExtension.HandlerPipeline.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.InvokeHandlerDelegate)
    00000076dbf7c680 00007ffd5c618999 Microsoft.Practices.Unity.InterceptionExtension.PolicyInjectionBehavior.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.GetNextInterceptionBehaviorDelegate)
    00000076dbf7c710 00007ffd5c61845d Microsoft.Practices.Unity.InterceptionExtension.InterceptionBehaviorPipeline.Invoke(Microsoft.Practices.Unity.InterceptionExtension.IMethodInvocation, Microsoft.Practices.Unity.InterceptionExtension.InvokeInterceptionBehaviorDelegate)
    00000076dbf7c7a0 00007ffd5c617002 Microsoft.Practices.Unity.InterceptionExtension.InterceptingRealProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage)
    00000076dbf7c880 00007ffdb911190c System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(System.Runtime.Remoting.Proxies.MessageData ByRef, Int32) [f:\dd\ndp\clr\src\BCL\system\runtime\remoting\realproxy.cs @ 823]
    00000076dbf7ca70 00007ffdbb4f4a02 [TPMethodFrame: 00000076dbf7ca70] Kingdee.BOS.Contracts.IUserParameterService.GetParamter(Kingdee.BOS.Context, Int64, System.String, System.String)
    00000076dbf7ccf0 00007ffd5c8d28c5 Kingdee.BOS.App.Security.K3CloudLoginService.SetRegionInfo(Kingdee.BOS.Context, Kingdee.BOS.Contracts.IUserParameterService, Kingdee.BOS.Orm.DataEntity.DynamicObject)
    00000076dbf7cd70 00007ffd5c22b2e2 Kingdee.BOS.App.Security.K3DataCenterService.GetDataCenterContextByID(System.String)
    00000076dbf7cdc0 00007ffd5c227d97 Kingdee.BOS.App.Security.K3CloudLoginService+c__DisplayClass8.b__3(System.String)
    00000076dbf7cdf0 00007ffd5c228471 Kingdee.BOS.Core.Authentication.AbstractAuthService.LoadContext(Kingdee.BOS.Core.Authentication.LoadContextArg)
    00000076dbf7ce50 00007ffd5c226ed8 Kingdee.BOS.App.Security.K3CloudLoginService.Login(Kingdee.BOS.Performance.Common.PerformanceContext, Kingdee.BOS.Authentication.LoginInfo)
    00000076dbf7ced0 00007ffd5c20b5a9 Kingdee.BOS.ServiceHelper.LoginServiceHelper.Login(Kingdee.BOS.Performance.Common.PerformanceContext, System.String, Kingdee.BOS.Authentication.LoginInfo)
    00000076dbf7cf30 00007ffd5c20960f Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateLoginInfo(System.String, Kingdee.BOS.Authentication.LoginInfo)
    00000076dbf7d080 00007ffd5c20783c Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser(System.String, System.String, System.String, Int32)
    00000076dbf7d318 00007ffdbb4f6793 [DebuggerU2MCatchHandlerFrame: 00000076dbf7d318] 
    00000076dbf7d658 00007ffdbb4f6793 [HelperMethodFrame_PROTECTOBJ: 00000076dbf7d658] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean)
    00000076dbf7d7d0 00007ffdb914b690 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[]) [f:\dd\ndp\clr\src\BCL\system\reflection\methodinfo.cs @ 761]
    00000076dbf7d840 00007ffdb9142922 System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) [f:\dd\ndp\clr\src\BCL\system\reflection\methodinfo.cs @ 735]
    00000076dbf7d8c0 00007ffd5c206201 Kingdee.BOS.ServiceFacade.KDServiceFx.ServiceExecutor.Execute(Kingdee.BOS.ServiceFacade.KDServiceFx.KDServiceContext, Kingdee.BOS.ServiceFacade.KDServiceFx.ServiceType, System.String[], Kingdee.BOS.ServiceFacade.SerializerProxy, Kingdee.BOS.ServiceFacade.KDServiceFx.ServiceType)
    00000076dbf7d960 00007ffd5c203ea9 Kingdee.BOS.ServiceFacade.KDServiceFx.ExecuteServiceModule.OnProcess(Kingdee.BOS.ServiceFacade.KDServiceFx.KDServiceContext)
    00000076dbf7da00 00007ffd5c203ab8 Kingdee.BOS.ServiceFacade.KDServiceFx.ModulePipeline.ExcuteRequest(Kingdee.BOS.ServiceFacade.KDServiceFx.KDServiceContext)
    00000076dbf7da50 00007ffd5c20123e Kingdee.BOS.ServiceFacade.KDServiceFx.RequestExcuteRuntime.StartRequest(Kingdee.BOS.ServiceFacade.KDServiceFx.RequestExtractor, Kingdee.BOS.ServiceFacade.KDServiceFx.WebContext)
    00000076dbf7daa0 00007ffd5c200f00 Kingdee.BOS.ServiceFacade.KDServiceFx.KDSVCHandler.ExecuteRequest(Kingdee.BOS.ServiceFacade.KDServiceFx.WebContext, Kingdee.BOS.ServiceFacade.KDServiceFx.RequestExtractor)
    00000076dbf7dae0 00007ffd5c200d45 Kingdee.BOS.ServiceFacade.KDServiceFx.KDSVCHandler.ProcessRequestInternal(Kingdee.BOS.ServiceFacade.KDServiceFx.WebContext, Kingdee.BOS.ServiceFacade.KDServiceFx.RequestExtractor)
    00000076dbf7db30 00007ffdac1a373e *** WARNING: Unable to verify checksum for System.Web.ni.dll
    System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
    00000076dbf7dbc0 00007ffdac1633fb System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)
    00000076dbf7dc10 00007ffdac178220 System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception)
    00000076dbf7dd70 00007ffdac163f79 System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext, System.AsyncCallback)
    00000076dbf7ddc0 00007ffdac1766c3 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext)
    00000076dbf7de40 00007ffdac165398 System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
    00000076dbf7e000 00007ffdac164f63 System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
    00000076dbf7e040 00007ffdac8646ba DomainNeutralILStubClass.IL_STUB_ReversePInvoke(Int64, Int64, Int64, Int32)
    00000076dbf7e8b0 00007ffdbb4f21fe [InlinedCallFrame: 00000076dbf7e8b0] System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr, System.Web.RequestNotificationStatus ByRef)
    00000076dbf7e8b0 00007ffdac1d2dde [InlinedCallFrame: 00000076dbf7e8b0] System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr, System.Web.RequestNotificationStatus ByRef)
    00000076dbf7e880 00007ffdac1d2dde DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr, System.Web.RequestNotificationStatus ByRef)
    00000076dbf7e940 00007ffdac16556f System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
    00000076dbf7eb00 00007ffdac164f63 System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
    00000076dbf7eb40 00007ffdac8646ba DomainNeutralILStubClass.IL_STUB_ReversePInvoke(Int64, Int64, Int64, Int32)
    00000076dbf7ed18 00007ffdbb4f2453 [ContextTransitionFrame: 00000076dbf7ed18] 
    
    

通过仔细比对发现这么一条Kingdee.BOS.App.Core.MainConsole.MainConsoleServer.GetMenuArrayForCache(Kingdee.BOS.Context)调用堆栈。从方法命名来看,像是用来获取菜单数组并缓存。结合前后堆栈的联系,我们可以大致得出这样一个线索:用户使用WebApi登录后会缓存一份独立的菜单供用户使用

有了代码堆栈,接下来知道怎么干了吧?当然是核实源代码确定问题啊。

4. 分析源码验证问题

Kingdee.BOS.App.Core.MainConsole.MainConsoleServer.GetMenuArrayForCache(Kingdee.BOS.Context)方法源代码如下:

GetMenuArrayForCache

我们发现它是用的UserToken来缓存用户菜单。看到Token,你可能就会条件反射的想到其生命周期。是的,聪明贤惠如你,Token是有生命周期的。也就意味着Token过期后,下次登录还会再次缓存一份菜单。你可能会问Token过期后没有去清对应的菜单缓存吗?是的,并没有。

严谨的你,可能又会问Token多久过期?20mins。你眼珠子一转,接着问,满打满算,一个用户1个小时也就申请3次Token,24小时,也就申请72个Token,一个菜单缓存也就顶多1K,所以一个用户一天也就最多占用72K。你的网站得有多少并发,才能被这么多菜单缓存撑爆啊?!

Good Question!!!

是的,客户的应用场景的并发也就顶多几百而已。那到底是什么导致如此多的菜单缓存呢?

原因是,客户的第三方客户端使用WebApi与我们的系统对接。而每次调用WebApi时都会先去调用登录接口,但却未保存会话信息。也就是说,客户第三方客户端每次的WebApi调用都会产生一个新的Token。那如果有成千上万的WebApi请求,也就意味着成千上万的菜单缓存啊。

好了,点到为止。至此,已经基本定位到问题的根源了。

5. 最后

也许很多同学没有接触过WinDbg,觉得其是一个复杂的工具。其实通过本文的案例讲解,其无非是通过一系列常见的命令来进行问题跟踪来定位问题。

最后来简单总结下,Windbg分析问题的步骤:

  1. 创建完整Dump文件
  2. Windbg加载Dump文件
  3. 根据不同问题类型,使用相关的命令进行分析
  4. 耐心分析,抽丝剥茧
  5. 边分析边猜测边验证
  6. 结合源码验证猜想
  7. 修复验证

hexo搭建

安装环境

  • nodejs,git安装
    此处不举例,自行百度

  • hexo-cli安装

    npm install -g hexo-cli

特定文件夹初始化hexo

$hexo init 或者npm install hexo --save

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>># 安装插件
>>npm install hexo-generator-index --save
>>npm install hexo-generator-archive --save
>>npm install hexo-generator-category --save
>>npm install hexo-generator-tag --save
>>npm install hexo-server --save
>>npm install hexo-deployer-git --save
>>npm install hexo-deployer-heroku --save
>>npm install hexo-deployer-rsync --save
>>npm install hexo-deployer-openshift --save
>>npm install hexo-renderer-marked --save
>>npm install hexo-renderer-stylus --save
>>npm install hexo-generator-feed --save
>>npm install hexo-generator-sitemap --save
>>

Git配置多个SSH-Key

  • 当有多个git账号时,比如:

    a. 一个gitee,用于公司内部的工作开发;

    b. 一个github,用于自己进行一些开发活动;

  • 解决方法

    1. 生成一个公司用的SSH-Key

      $ ssh-keygen -t rsa -C '174499700@qq.com' -f ~/.ssh/gitee_id_rsa

    2. 生成一个github用的SSH-Key

      ssh-keygen -t rsa -C 'benguahao@foxmail.com' -f ~/.ssh/github_id_rsa

    3. 在 ~/.ssh 目录下新建一个config文件,添加如下内容(其中Host和HostName填写git服务器的域名,IdentityFile指定私钥的路径)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # gitee
      Host gitee.com
      HostName gitee.com
      PreferredAuthentications publickey
      IdentityFile ~/.ssh/gitee_id_rsa
      # github
      Host github.com
      HostName github.com
      PreferredAuthentications publickey
      IdentityFile ~/.ssh/github_id_rsa

如果源的网速不好

可以更换淘宝源:npm install -g cnpm --registry=https://registry.npm.taobao.org

把npm命令替换使用cnpm命令

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# Hexo Configuration  
## Docs: https://hexo.io/docs/configuration.html
## Source: https://github.com/xyfy/xyfy.github.io

# Site 站点信息设置
title: 心雨纷扬的博客 #站名
subtitle: 一个简单的博客 #副标题
description: #站描述
author: Xyfy #作者
language: zh-CN #语言
timezone:

# URL 链接设置
## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
url: http://www.52dzd.com
root: /
permalink: :year/:month/:day/:title/
permalink_defaults:

# Directory 文件目录
source_dir: source
public_dir: public
tag_dir: tags
archive_dir: archives
category_dir: categories
code_dir: downloads/code
i18n_dir: :lang
skip_render:

# Writing 文章
new_post_name: :title.md # File name of new posts
default_layout: post
titlecase: false # Transform title into titlecase
external_link: true # Open external links in new tab
filename_case: 0
render_drafts: false
post_asset_folder: false
relative_link: false
future: true
highlight:
enable: true
line_number: true
auto_detect: true
tab_replace:

# Category & Tag
default_category: uncategorized
category_map:
tag_map:

# Date / Time format 日期
## Hexo uses Moment.js to parse and display date
## You can customize the date format as defined in
## http://momentjs.com/docs/#/displaying/format/
date_format: YYYY-MM-DD
time_format: HH:mm:ss

# Pagination 分页
## Set per_page to 0 to disable pagination
per_page: 20
pagination_dir: page

# Extensions 扩展
## Plugins: https://hexo.io/plugins/
## Themes: https://hexo.io/themes/
theme: landscape

# Deployment 这里设置了Git获
#这里一定要注意不要写错了,否则部署到Github上会出问题
## Docs: https://hexo.io/docs/deployment.html
deploy:
type: git
repo: git@github.com:xyfy/xyfy.github.io.git
branch: master
message: '站点更新:{{now("YYYY-MM-DD HH/mm/ss")}}'

发布部署

1
2
3
4
# 编译
hexo generate
# 在主机的hexo目录下 执行以下命令将自动更新到Github
hexo d

修改主题和配置配置文件

  • 安装主题NexT

    ps: 我们现在在目录hexo下

    git clone https://github.com/iissnan/hexo-theme-next themes/next

    并在目录hexo下的_config.yml中找到 theme: 修改后面的参数,默认是 landscape

    theme: next

  • 克隆慢问题解决

    修改/etc/hosts文件 ,加入两行

    1
    2
    151.101.72.249 http://global-ssl.fastly.Net
    192.30.253.112 http://github.com

参考文档

elastic安装过程-Win7

下载最新版openjdk安装

  • 由于oracle对jdk进行了收费,不能用于相关的商业用途,可以下载基于GPL的openjdk代替

    下载windows的压缩包后,进行解压到指定目录,例如D:\java\jdk-11.0.1

  • 打开系统设置,设置环境变量

    1. 第一步:右键“我的电脑”,选择“属性”,弹出的对话框中选择“高级系统设置”

    2. 选择“高级”,点击“环境变量”按钮,进入环境变量配置界面

    3. 添加JAVA_HOME变量,点击新建按钮,输入相应数据

      变量名:JAVA_HOME,变量值:D:\java\jdk-11.0.1(jdk安装的路径)

    4. 添加CLASSPATH变量,点击新建按钮,输入相应数据

      变量名:CLASSPATH,变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

      切记:最前面.;必须要有,不能删除

    5. 设置path属性,找到变量path,点击编辑在其变量值后面加上:

      %java_home%\bin;%java_home%\jre\bin;

      新添加变量值与已有变量值必须分好;隔开

    6. 测试是否成功,在powershell中执行:java –version

      1
      2
      3
      openjdk 11.0.1 2018-10-16
      OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
      OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)

下载elasticsearch

zip压缩包安装

  • 下载最新版本的elasticsearch

  • 下载完成后进行解压到指定目录,例如D:\elasticsearch-6.2.2

  • 打开powershell 进入到目录,

    d:

    cd elasticsearch-6.2.2

msi安装


启动elasticsearch

1
2
# - 打开powershell 进入到目录后运行bat文件
.\bin\elasticsearch

安装错误

  • 默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以修改 Elastic 安装目录的config/elasticsearch.yml文件,去掉network.host的注释,将它的值改成0.0.0.0,然后重新启动 Elastic。

下载安装kibana

安装中文分词器

  1. 执行命令

    ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.2/elasticsearch-analysis-ik-6.2.2.zip

  2. 测试IK

    1. 创建Index

      curl -XPUT http://localhost:9200/index

    2. 创建 mapping

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      curl -XPOST http://localhost:9200/index/fulltext/_mapping -H 'Content-Type:application/json' -d'
      {
      "properties": {
      "content": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_max_word"
      }
      }

      }'
    3. 生成若干索引文档

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      curl -XPOST http://localhost:9200/index/fulltext/1 -H 'Content-Type:application/json' -d'
      {"content":"美国留给伊拉克的是个烂摊子吗"}
      '
      curl -XPOST http://localhost:9200/index/fulltext/2 -H 'Content-Type:application/json' -d'
      {"content":"公安部:各地校车将享最高路权"}
      '
      curl -XPOST http://localhost:9200/index/fulltext/3 -H 'Content-Type:application/json' -d'
      {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
      '
      curl -XPOST http://localhost:9200/index/fulltext/4 -H 'Content-Type:application/json' -d'
      {"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
      '
    4. 高亮查询

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      curl -XPOST http://localhost:9200/index/fulltext/_search  -H 'Content-Type:application/json' -d'
      {
      "query" : { "match" : { "content" : "中国" }},
      "highlight" : {
      "pre_tags" : ["<tag1>", "<tag2>"],
      "post_tags" : ["</tag1>", "</tag2>"],
      "fields" : {
      "content" : {}
      }
      }
      }
      '
  3. 字典配置

    IKAnalyzer.cfg.xml 文件一般位于 {conf}/analysis-ik/config/IKAnalyzer.cfg.xml 或者 {plugins}/elasticsearch-analysis-ik-*/config/IKAnalyzer.cfg.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
    <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">custom/ext_stopword.dic</entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <entry key="remote_ext_dict">location</entry>
    <!--用户可以在这里配置远程扩展停止词字典-->
    <entry key="remote_ext_stopwords">http://xxx.com/xxx.dic</entry>
    </properties>
  4. 热更新 IK 分词使用方法

    目前该插件支持热更新 IK 分词,通过上文在 IK 配置文件中提到的如下配置

    1
    2
    3
    4
    <!--用户可以在这里配置远程扩展字典 -->
    <entry key="remote_ext_dict">location</entry>
    <!--用户可以在这里配置远程扩展停止词字典-->
    <entry key="remote_ext_stopwords">location</entry>

    其中 location 是指一个 url,比如 http://yoursite.com/getCustomDict,该请求只需满足以下两点即可完成分词热更新。

    该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。

    该 http 请求返回的内容格式是一行一个分词,换行符用 \n 即可。

    满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例。

    可以将需自动更新的热词放在一个 UTF-8 编码的 .txt 文件里,放在 nginx 或其他简易 http server 下,当 .txt 文件修改时,http server 会在客户端请求该文件时自动返回相应的 Last-Modified 和 ETag。可以另外做一个工具来从业务系统提取相关词汇,并更新这个 .txt 文件。

参考文档

elastic安装过程-Ubuntu

直接下载jdk压缩包方式安装(这里只介绍jdk7的,jdk8 的原理完全一致)

分为下面5个步骤

官网下载JDK

地址: http://www.oracle.com/technetwork/articles/javase/index-jsp-138363.html , 选择相应的 .gz包下载

解压缩,放到指定目录(以jdk-7u60-linux-x64.gz为例)

  1. 创建目录:

    sudo mkdir /usr/lib/jvm

  2. 解压缩到该目录:

    sudo tar -zxvf jdk-7u60-linux-x64.gz -C /usr/lib/jvm

修改环境变量

sudo vim ~/.bashrc

  1. 文件的末尾追加下面内容:

    1
    2
    3
    4
    5
    #set oracle jdk environment
    export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_60 ## 这里要注意目录要换成自己解压的jdk 目录
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
  2. 使环境变量马上生效
    source ~/.bashrc

设置系统默认jdk 版本

1
2
3
4
5
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.7.0_60/bin/java 300  
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.7.0_60/bin/javac 300
sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/jdk1.7.0_60/bin/jar 300
sudo update-alternatives --install /usr/bin/javah javah /usr/lib/jvm/jdk1.7.0_60/bin/javah 300
sudo update-alternatives --install /usr/bin/javap javap /usr/lib/jvm/jdk1.7.0_60/bin/javap 300

 然后执行:sudo update-alternatives --config java

若是初次安装jdk,会有下面的提示
1
2
There is only one alternative in link group java (providing /usr/bin/java): 
/usr/lib/jvm/jdk1.7.0_60/bin/java
否则,选择合适的jdk

测试jdk

1
2
3
4
5
java -version
#显示如下
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)
jdk 安装成功

下载elasticsearch

1
2
3
4
5
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz.sha512
shasum -a 512 -c elasticsearch-6.2.4.tar.gz.sha512
tar -xzf elasticsearch-6.2.4.tar.gz
cd elasticsearch-6.2.4/

启动elasticsearch

1
2
3
4
5
6
# Running Elasticsearch from the command line
./bin/elasticsearch
# Running as a daemon
./bin/elasticsearch -d -p pid
#To shut down Elasticsearch, kill the process ID recorded in the pid file:
kill `cat pid`

安装错误

  • max file descriptors [4096] for elasticsearch process is too low

    解决办法:

    1
    2
    3
    4
    5
    sudo vim /etc/security/limits.conf

    # 在最后面追加下面内容
    *** - nofile 65536
    *** 是启动ES的用户

    Ubuntu ignores the limits.conf file for processes started by init.d. To enable the limits.conf file, edit /etc/pam.d/su and uncomment the following line:

    #session required pam_limits.so

  • max virtual memory areas vm.max_count [65530] likely too low,increase to at least [26244]

    解决办法

    sudo sysctl -w vm.max_map_count=262144

  • 默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以修改 Elastic 安装目录的config/elasticsearch.yml文件,去掉network.host的注释,将它的值改成0.0.0.0,然后重新启动 Elastic。

安装中文分词器

  1. 执行命令

    ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.4/elasticsearch-analysis-ik-6.2.4.zip

  2. 配置IK[仅供v5.0以下版本使用]

    执行以下CURL

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    curl -XPOST 'http://localhost:9200/_all/_close' 
    curl -XPUT 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '{
    "index.analysis.analyzer.default.type" : "ik_max_word",
    "index.analysis.analyzer.ik.alias" : [
    "ik_analyzer"
    ],
    "index.analysis.analyzer.ik.type" : "org.elasticsearch.index.analysis.IkAnalyzerProvider",
    "index.analysis.analyzer.ik_max_word.type" : "ik_max_word",
    "index.analysis.analyzer.ik_max_word.use_smart" : "false",
    "index.analysis.analyzer.ik_smart.type" : "ik_max_word",
    "index.analysis.analyzer.ik_smart.use_smart" : "true"
    }'

最近这段时间,开始使用TFS2010进行项目的源码管理,在使用过程中,发现了不些问题,由于开发人员的操作失误,经常导致了源码中的文件被锁定,而在开发人员的PC机上又不能把锁定的文件签入到TFS中,刚开始遇到这个问题时,想通过管理员帐号来“取消锁定”,但在“源代码管理器”中,管理员帐号也没有权限操作“取消锁定”。遇到这种文件被锁定的事,是相当的郁闷。 郁闷归郁闷,问题还是得要解决,所以baidu、google了不少资料,原来“取消锁定”是不能通过界面来操作的,而是要使用TFS的命令来实现解锁操作,在不断的摸索和参考其它文章,总算把这个头痛的问题解决了,为了方便以后解决同样的问题、也为了其他同志在遇到这相相似的问题时有一个解决方案,故把我解决的过程记录一下。

  1. CMD到TFS的命令

    • A:32位操作系统:c:/program files/microsoft visual studio 10.0/common7/ide。
    • B:64位操作系统:c:/program files(x86)/microsoft visual studio 10.0/common7/ide。
  2. 执行tf undo解锁命令 如:

    c:\\program files (x86)\\microsoft visual studio 10.0\\common7\\ide\\tf undo /workspace:testing-pc;test\_user $/works/ias.works/ias.mvcimp/controllers/homecontroller.cs

    注:testing_pc:表示锁定文件的工作区;test_user:表示的是锁定文件的用户。譬如我自己的PC机上的工作区是:BEA-PC,我的TFS登录帐号是:tfs001。则:tf undo /workspace:BEA-PC;tfs001

@: item.content
用过ASP.NET MVC的人都知道,这是MVC的基本输出的方式,但是最近我在写一个页面的时候,却碰上了一个问题,我需要在一个div中输出一个<br />标签,然而他却直接把<br />给输了出来,这确实让人很郁闷。 我看了一下代码,原来在输出的时候,这种方式直接把<和>给变换成了&lt;&gt;,所以我想尽任何编码解码的方式想要把这个给还原出来,然而什么都没有效果。 在不断摸索之后我发现了简单的不能再简单的方法,

@("<h1>asdfasd</h1>")

@(new HtmlString( "<h1>asdfasd</h1>"))

@(Html.Encode("<h1>asdfasd</h1>"))

  • 如何删除工作项

    1. 使用Tfs管理员账户登录

    2. 使用Cmd打开命令行窗口

      • 如果是32位系统

        cd "C:\\Program Files\\Microsoft Visual Studio 10.0\\Common7\\IDE"

      • 64位系统

        cd "C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\Common7\\IDE"

    3. 使用 witadmin.exe destroywi命令,按下面的方式
      ``witadmin.exe destroywi /Collection:http:\\[ServerName]:8080\tfs\[CollectionName] /id:[WI ID]`

      可以一次删除多个工作项,使用逗号分隔工作项Id,比如10,22,30。可以使用 /noprompt屏蔽提示消息

    4. 假设服务器名称为ServerDemo,团队项目集合名称为TeamDemo,要删除Id为17、18的工作项,则使用如下命令:

      witadmin.exe destroywi /Collection:http:\\\ServerDemo:8080\\tfs\\TeamDemo /id:17,18

    5. 上述方法为微软工作人员答疑,经测试,在Tfs2010 简体中文正式版,能够正常的删除工作项。请注意,在做这个操作之前,先关闭Vs2010。

  • 使用Ghost或者Windows 镜像备份的情形下,如何备份项目集?

    当我们安装了操作系统、开发环境之后,我们常常为此时干净的系统,做一个镜像备份,有时候是使用Ghost,有时候是使用Windows 7或者Sql Server 2008 R2的Server Backup功能做镜像备份。当然,因为安装了Sql server 2008 R2和Tfs2010、Vs2010之后,C:盘往往有17G左右,因为速度的关系我们推荐使用Ghost,能在20分钟之内恢复C:\盘,使用Windows Server Backup功能,常常需要数个小时。

    我们一般做两个Ghost镜像,第一个是操作系统安装好、驱动安装好、操作系统各项更新完成、常用软件如Live Writer、QQ、网银、迅雷、Winrar之类安装好、操作系统配置好(比如关机不要输入关机原因、登录不需要按Ctrl+Alt+Del、或者自动使用某个账户登录而无需输入密码等等),这些完成之后做一个镜像,叫做工作镜像。在这个镜像做好之后,安装开发环境,然后做第二个镜像:开发环境镜像。请注意做镜像前关闭休眠功能并删除休眠文件、禁用虚拟内存或将虚拟内存文件放在D:盘,这样会大大的减少镜像文件的大小。

    那么,每次恢复镜像,会造成Tfs的项目管理信息丢失。所以,这之前需要备份Tfs的数据库,这是件很麻烦的事情,下面列出我目前采用的一个取巧的方法,请注意我在自己个人的开发机器上安装的是Tfs的Basic版本:

    1. 安装Sql 2008 R2和Tfs 2010之后,默认的项目集保存在C:盘,此时我们在C盘将三个Tfs数据库,备份在C:盘默认的Sql Server备份位置。这是为了防止Tfs系统完全不匹配,造成不能正常工作的最后挽救方法。
    2. 在Sql server中设置默认的数据库位置在D:\Database或D:盘的其他目录
    3. 重新启动系统,注意,不要忽略这一步,我们在上一步的设置或许仅仅是修改了一个配置项,目前Sql的默认数据库文件存放路径,还是在C:盘,没有改变。
    4. 使用Tfs 2010的管理控制台,创建新的团队项目集合,假设我们为其命名为TeamWork。
    5. 此时,你会发现在D:\Database下,有了一个新的数据库Tfs_TeamWork
    6. 将Sql server的三个Tfs_开头的数据库,同样备份到C:盘,这个时候再开始为系统做Ghost镜像,今后每次使用Ghost恢复干净的开发环境,就不用考虑Tfs数据库的问题,直接用Ghost恢复就行了。当然,前提是你不要删除掉D:\Database目录下的相关数据库。以后,只需要随时备份Tfs_TeamWork以策万全。
    7. 如果D:\盘的数据库出现意外,最坏的情况,我们使用C:盘的初始备份能让系统正常运行起来,然后再用平常做的Tfs_TeamWork的备份,按照标准的恢复模式进行。 注意,如果我们仅备份某个团队项目集合的数据库,而没有备份Tfs_Configuration数据库,则在上次创建镜像到此次恢复镜像期间创建的团队项目会丢失。
  • 安装好Scrum模版后,创建新的团队项目集合时,如何使用? 选择该团队项目集合,右键,运行过程模版管理器。选上载,找到安装目录:默认是C:\Program Files (x86)\Microsoft\Microsoft Visual Studio Scrum 1.0\Process Template 此后创建团队项目时,就多了Scrum项目这一项。

  • 如何清除Vs2010的工作区影射关系的缓存信息? 在原有的团队项目集合移除,或者更换Tfs服务器后,一些工作区的影射关系仍然存在,这会导致“将解决方案添加到源代码管理”之类的功能不可使用。 这些信息缓存于文件C:\Users\Administrator\AppData\Local\Microsoft\TeamFoundation\3.0\Cache\VersionControl.config中,只要把跟旧服务器相关的 ServerInfo 节点删掉,问题即可解决。

  • 如何还原已经备份的团队项目集合数据库?

    1. 关闭Tfs服务: 运行: “C:\Program Files\Microsoft Team Foundation Server 2010”\Tools\TFSServiceControl quiesce
    2. 还原数据库,请注意两个选项:选择从设备恢复、选择覆盖原数据库
    3. 启动Tfs服务: 运行: “C:\Program Files\Microsoft Team Foundation Server 2010”\Tools\TFSServiceControl unquiesce
  • 删除团队项目

    "C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\Common7\\IDE\\TFSDeleteProject" /force /collection:http://x200:8080/Stock Faster

    其中http://x200:8080是服务器名称和端口,Stock是团队项目集合的名称,Faster是Stock团队项目集合中要删除的项目