我作了一个服务端程序,使用indy的TIdTelnet控件通过telnet接收一个unix服务器发送的信息,然后把它保存在一个TStrings中。同时用另一个线程对其进行分析,再发往另一个服务端程序。功能上没什么问题,可是运行一段时间(大半天左右)后该程序就会突然消失。请问各位大虾这是怎么回事儿?是不是用来保存信息的TStrings有大小限制,超出该限制就会出问题?unix服务器发送的信息挺多的,用txt来保存的话,一个小时大概2.5MB左右。

解决方案 »

  1.   

    用TThreadList来进行保存/处理/删除,TStrings的count也是有限制的
      

  2.   

    自定义个结构做吧,vcl时间长了肯定玩完。
      

  3.   

    对了,再问一个小问题:对“程序突然消失”这种情况应该怎样查找消失原因呢?
    还有,我的内存是512M的,程序消失前一共生成了20M左右的txt文件,似乎也不是很多。
      

  4.   

    to hongqi162(失踪的月亮):TThreadList可以用来保存/处理/删除字符串吗?你说的是不是TStringList?
    如果TStrings的count有限制,那我在它的count达到一个数值(比如20000)时就停止接收unix服务器的数据,直到count小于20000为止(分析该TStrings的线程会delete它的内容),然后再次开始接收数据,这样作行吗?会不会漏掉unix服务器的数据?从停止接收到再次接收这段时间内的数据是怎样的呢?
      

  5.   

    我在调试环境下运行该程序(已经把保存信息的变量换成TStringList了),最后程序出错的时候报的信息是“Project F:\Myproj\告警采集\MNSA_ERIC_ALARM.exe faulted with message: 'access violation at 0x00406c65: write of address 0x00030c30'. Process Stopped. Use Step or Run to continue.”。然后不管是使用F8还是F7,都是这个错误信息,这到底是为什么呢?
    to sdzeng(大头鸟) :事件查看器也没有我这个程序的相关信息。。
      

  6.   

    一个小时2.5MB这个不大,关键点肯定在于你的程序当中多线程访问没有控制好。或者内存分配有问题。前两天弄个小东西,查了两天两夜不知道问题出在哪里,查来查去实在想不到代码当中有什么问题,后来偶然一次调试状态下也出现问题,跟了进去,原来是内存管理当中有问题,内存片的引用计数出错,再查一下原来是IsMultiThread在捣鬼,默认情况下只有调用BeginThread才会给它置为True,而我在创建线程之前已经分配了一堆内存,于是产生内存访问违例,并且地址是重复的。
      

  7.   

    TStringList行数的限制应该是TList的限制,大小为134217727,就算是一个字节一行,那么也需要近128MB,而楼主说一小时才2.5MB,至少可以存储51小时的数据,即两天两夜才执行一次数据分析也保准不会出现任何问题,更何况楼主不可能一个字节行地存吧?也不可能两天两夜才整理一次吧?
      

  8.   

    内存访问出错造成程序崩溃,这和你的具体代码有关,别人没法帮你分析
    在调试状态下检查代码吧,看看是哪一行代码出错如果是不定时出现,就用下面的办法
    http://topic.csdn.net/t/20041130/12/3601416.html
      

  9.   

    to sdzeng(大头鸟) :谢谢你的建议,我看了那个网页,受益匪浅。
    但我照着作却没有找到出错的代码行号:在调试环境出错时弹出两个提示,一个是“Project MNSA_ERIC_ALARM.exe raised exception class EAccessViolation with message 'Access violation at address 00402A03 in module 'MNSA_ERIC_ALARM.exe'. Read of address 0249B5F4'. Process stopped. Use Step or Run to continue.”,另一个是“Project F:\爱立信告警采集17\MNSA_ERIC_ALARM.exe faulted with message: 'access violation at 0x00406c65: write of address 0x00030d40'. Process Stopped. Use Step or Run to continue.”。
    其中两个崩溃地址“00402A03”和“0x00406c65”经过运算后都没有在map文件中找到对应行号(我连“0249B5F4”、“0x00030d40”都找过了)?这是怎么回事儿呢?
    BTW:下面是我的map文件的最重要的部分。Line numbers for Un_DBLink(Un_DBLink.pas) segment .text    33 0001:00092AA0    34 0001:00092ABE    35 0001:00092ACA    36 0001:00092AD4
        37 0001:00092AE0    38 0001:00092AEA    39 0001:00092B0F    40 0001:00092B25
        41 0001:00092B33    42 0001:00092B3D    44 0001:00092B58    46 0001:00092B87
        48 0001:00092C20    48 0001:00092C27Line numbers for Un_AnalyzeEDWH_Thread(Un_AnalyzeEDWH_Thread.pas) segment .text    66 0001:00092CB4    67 0001:00092CE5    68 0001:00092CEF    69 0001:00092D01
        70 0001:00092D17    71 0001:00092D24    72 0001:00092D31    74 0001:00092D44
        76 0001:00092D55    77 0001:00092D63    78 0001:00092D78    79 0001:00092D80
        80 0001:00092D8D    81 0001:00092D9F    84 0001:00092DA9    85 0001:00092DC9
        86 0001:00092DDE    82 0001:00092DE6    91 0001:00092DFF    95 0001:00092E0F
        96 0001:00092E1D    98 0001:00092E2B    99 0001:00092E39   101 0001:00092E55
       104 0001:00092E5A   105 0001:00092EA1   113 0001:00092F28   117 0001:00092F4B
       119 0001:00092F58   120 0001:00092F62   122 0001:00092F6A   125 0001:00092F7B
       127 0001:00092F99   129 0001:00092FB8   132 0001:00093013   133 0001:00093021
       135 0001:00093032   136 0001:0009304D   140 0001:00093079   143 0001:000930A3
       144 0001:000930B4   145 0001:000930C0   146 0001:000930D1   147 0001:000930E2
       149 0001:000930F3   150 0001:00093104   152 0001:0009311A   154 0001:00093152
       156 0001:00093170   158 0001:000931AB   160 0001:000931CA   164 0001:00093205
       165 0001:0009323D   167 0001:0009324E   169 0001:00093268   172 0001:00093271
       174 0001:000932B5   175 0001:000932CC   176 0001:000932E4   178 0001:000932F5
       180 0001:00093311   181 0001:00093360   183 0001:00093371   184 0001:00093372
       170 0001:00093382   187 0001:000933B3   167 0001:000933B4   189 0001:000933BD
       191 0001:000933BF   158 0001:000933C2   193 0001:000933C9   195 0001:000933CB
       154 0001:000933CE   199 0001:000933D5   201 0001:000933EB   202 0001:00093413
       203 0001:00093424   204 0001:0009342E   205 0001:0009343B   207 0001:00093448
       209 0001:00093464   210 0001:00093491   213 0001:000934A2   215 0001:000934A4
       127 0001:000934A7   217 0001:000934AE   218 0001:000934BC   219 0001:000934C4
       220 0001:000934D2   221 0001:000934E0   223 0001:000934F7   226 0001:000934FC
       115 0001:00093503   228 0001:00093535   232 0001:0009362C   233 0001:00093636
       237 0001:00093638   238 0001:00093645   242 0001:00093648   243 0001:00093650
       247 0001:00093654   248 0001:00093657   249 0001:00093664   250 0001:00093671
       254 0001:00093690   255 0001:00093693   256 0001:000936A0   257 0001:000936AD
       262 0001:000936CC   263 0001:000936CF   264 0001:000936D6   274 0001:0009370C
       274 0001:00093713
      

  10.   

    Line numbers for Un_TelnetOSS_Alarm(Un_TelnetOSS_Alarm.pas) segment .text    43 0001:0009B4E4    44 0001:0009B4F7    45 0001:0009B50A    46 0001:0009B51A
        47 0001:0009B52A    48 0001:0009B551    51 0001:0009B558    52 0001:0009B563
        53 0001:0009B56B    54 0001:0009B57E    57 0001:0009B584    58 0001:0009B5A5
        60 0001:0009B5B6    61 0001:0009B5C4    62 0001:0009B5D9    63 0001:0009B5E1
        64 0001:0009B5EE    65 0001:0009B600    66 0001:0009B60E    67 0001:0009B616
        69 0001:0009B626    70 0001:0009B654    71 0001:0009B66C    72 0001:0009B69A
        75 0001:0009B6D7    78 0001:0009B6E9    82 0001:0009B6F9    83 0001:0009B70F
        85 0001:0009B721    86 0001:0009B72C    87 0001:0009B737    88 0001:0009B745
        89 0001:0009B753    91 0001:0009B769    93 0001:0009B790    97 0001:0009B814
        98 0001:0009B820   102 0001:0009B840   103 0001:0009B84F   113 0001:0009B86C
       114 0001:0009B895   115 0001:0009B897   117 0001:0009B89B   120 0001:0009B8A6
       122 0001:0009B8B0   123 0001:0009B8B8   124 0001:0009B8C8   126 0001:0009B8D6
       127 0001:0009B8DB   128 0001:0009B8EA   129 0001:0009B8F2   132 0001:0009B902
       134 0001:0009B95F   136 0001:0009B969   138 0001:0009B977   139 0001:0009B97A
       141 0001:0009B986   142 0001:0009B990   143 0001:0009B991   145 0001:0009B995
       144 0001:0009B996   130 0001:0009B9AC   147 0001:0009B9BC   151 0001:0009B9C9
       155 0001:0009B9DB   156 0001:0009B9F5   157 0001:0009BA03   153 0001:0009BA05
       161 0001:0009BA1C   162 0001:0009BA36   163 0001:0009BA44   159 0001:0009BA48
       165 0001:0009BA5F   167 0001:0009BA70   168 0001:0009BA7D   169 0001:0009BA8B
       170 0001:0009BA8F   174 0001:0009BAC8   176 0001:0009BB90   176 0001:0009BB97Line numbers for Un_about(Un_about.pas) segment .text    28 0001:0009BD8C    28 0001:0009BD93Line numbers for Un_main(Un_main.pas) segment .text    44 0001:0009BFC8    45 0001:0009BFDF    46 0001:0009BFF3    48 0001:0009C007
        49 0001:0009C024    50 0001:0009C042    52 0001:0009C04F    54 0001:0009C061
        55 0001:0009C068    57 0001:0009C06F    58 0001:0009C077    59 0001:0009C07F
        61 0001:0009C093    63 0001:0009C0A7    64 0001:0009C0BB    67 0001:0009C0DF
        70 0001:0009C0FC    71 0001:0009C104    72 0001:0009C112    73 0001:0009C11E
        74 0001:0009C12E    76 0001:0009C13B    78 0001:0009C145    80 0001:0009C14A
        82 0001:0009C154    85 0001:0009C159    86 0001:0009C165    88 0001:0009C180
        90 0001:0009C185    97 0001:0009C18C    98 0001:0009C1A3    99 0001:0009C1B7
       101 0001:0009C1C8   102 0001:0009C1D6   103 0001:0009C1EB   104 0001:0009C1F3
       105 0001:0009C200   106 0001:0009C212   109 0001:0009C21C   111 0001:0009C23C
       107 0001:0009C244   114 0001:0009C25D   118 0001:0009C26D   119 0001:0009C2B3
       126 0001:0009C31C   127 0001:0009C33C   129 0001:0009C349   130 0001:0009C34B
       132 0001:0009C35C   133 0001:0009C36A   134 0001:0009C37F   135 0001:0009C387
       136 0001:0009C394   137 0001:0009C3A6   138 0001:0009C3AE   139 0001:0009C3BB
       142 0001:0009C3D5   143 0001:0009C3FC   144 0001:0009C421   146 0001:0009C446
       148 0001:0009C447   140 0001:0009C44F   151 0001:0009C46C   154 0001:0009C49E
       158 0001:0009C530   159 0001:0009C546   160 0001:0009C555   161 0001:0009C561
       163 0001:0009C594   163 0001:0009C59B
      

  11.   


    Line numbers for Un_public(Un_public.pas) segment .text    58 0001:0009C648    60 0001:0009C677    62 0001:0009C6A1    63 0001:0009C6B9
        65 0001:0009C6E2    66 0001:0009C6F4    67 0001:0009C70E    68 0001:0009C728
        69 0001:0009C742    71 0001:0009C75C    73 0001:0009C774    74 0001:0009C7AB
        76 0001:0009C7B7    77 0001:0009C7D1    78 0001:0009C7E4    79 0001:0009C81A
       107 0001:0009C850   108 0001:0009C8B0   109 0001:0009C8BE   110 0001:0009C8FB
       112 0001:0009C943   115 0001:0009C952   116 0001:0009C9AF   117 0001:0009C9BD
       119 0001:0009C9C9   120 0001:0009C9DB   121 0001:0009C9EB   122 0001:0009CA40
       123 0001:0009CA82   126 0001:0009CB00   127 0001:0009CB1D   128 0001:0009CB32
       129 0001:0009CB5B   135 0001:0009CB60   136 0001:0009CBC0   137 0001:0009CBCE
       138 0001:0009CC0B   140 0001:0009CC53   143 0001:0009CC62   144 0001:0009CCBF
       145 0001:0009CCCD   147 0001:0009CCD9   148 0001:0009CCEB   149 0001:0009CCFB
       150 0001:0009CD50   151 0001:0009CD92   153 0001:0009CE60   153 0001:0009CE67Line numbers for Un_Th_DppAlarmConn(Un_Th_DppAlarmConn.pas) segment .text    45 0001:0009CEEC    46 0001:0009CEFE    47 0001:0009CF07    48 0001:0009CF22
        66 0001:0009CF28    70 0001:0009CF4C    72 0001:0009CF59    74 0001:0009CF63
        76 0001:0009CF6D    77 0001:0009CF7B    78 0001:0009CF87    80 0001:0009CF90
        81 0001:0009CFA1    83 0001:0009CFB6    85 0001:0009CFD0    86 0001:0009CFD4
        88 0001:0009CFD8    90 0001:0009CFF2    91 0001:0009CFF6    94 0001:0009CFFA
        96 0001:0009D00E    97 0001:0009D033    98 0001:0009D051   100 0001:0009D076
       101 0001:0009D084   103 0001:0009D0BC   106 0001:0009D0C1   107 0001:0009D0E6
       108 0001:0009D104   110 0001:0009D129   111 0001:0009D137   113 0001:0009D16F
       116 0001:0009D174   118 0001:0009D199   119 0001:0009D1A7   121 0001:0009D1E2
       124 0001:0009D1E7   126 0001:0009D1F1   128 0001:0009D221   129 0001:0009D255
       130 0001:0009D264   132 0001:0009D269   137 0001:0009D29D   140 0001:0009D2A1
       143 0001:0009D2C6   144 0001:0009D2CE   145 0001:0009D2D2   148 0001:0009D300
       149 0001:0009D325   152 0001:0009D343   154 0001:0009D357   155 0001:0009D369
       156 0001:0009D375   157 0001:0009D38E   158 0001:0009D399   159 0001:0009D3A0
       160 0001:0009D3A6   162 0001:0009D3B5   164 0001:0009D3C2   165 0001:0009D3E5
       166 0001:0009D3F4   167 0001:0009D403   168 0001:0009D412   169 0001:0009D421
       172 0001:0009D42E   173 0001:0009D439   175 0001:0009D519   176 0001:0009D524
       178 0001:0009D52F   179 0001:0009D53D   182 0001:0009D54E   184 0001:0009D55D
       186 0001:0009D56B   190 0001:0009D56F   192 0001:0009D579   194 0001:0009D587
       195 0001:0009D5AC   197 0001:0009D5BD   199 0001:0009D5DA   202 0001:0009D5DF
        78 0001:0009D5EB   205 0001:0009D603   208 0001:0009D608    68 0001:0009D60F
       210 0001:0009D64E   214 0001:0009D7B0   215 0001:0009D7B8   219 0001:0009D7BC
       220 0001:0009D7C4   222 0001:0009D7F8   222 0001:0009D7FFLine numbers for MNSA_ERIC_ALARM(F:\爱立信告警采集17\MNSA_ERIC_ALARM.dpr) segment .text    15 0001:0009DB38    16 0001:0009DB4F    17 0001:0009DB56    18 0001:0009DB65
        19 0001:0009DB71    20 0001:0009DB84    21 0001:0009DB97    22 0001:0009DB9EBound resource filese:\program files\borland\delphi6\Lib\CONTROLS.RES
    e:\program files\borland\delphi6\Lib\BUTTONS.RES
    e:\program files\borland\delphi6\Lib\EXTDLGS.RES
    Un_DBLink.dfm
    Un_about.dfm
    Un_main.dfm
    MNSA_ERIC_ALARM.res
    MNSA_ERIC_ALARM.drfProgram entry point at 0001:0009DB38
      

  12.   

    从你发的map文件的确看不出来
    在工程里加上map选项后,要Build一遍,运行的时候,要使用Build出来的exe
    检查一下,看看是否这样子做的如果还找不到,那就试一下装Delphi环境,
    然后调试状态下,等程序出错,看看是哪一行
      

  13.   

    又仔细查了一下,应该是线程同步没做好,导致内存访问出错,谢谢unsigned的意见!
    也很感谢sdzeng(大头鸟)让我了解到一种很好的纠错方法,谢谢大家!