• Sign in
 

LATAM Team blog

Search Blogs
Tags
  • Cloud
  • Cluster
  • Crash
  • Desarrollo
  • Desenvolvimento
  • Directory Services
  • DST
  • Español
  • Exchange/Outlook
  • Hang
  • High Availability
  • IIS
  • Networking
  • Office
  • People
  • Performance
  • Português
  • PowerShell Scripts
  • Security
  • Setup
  • Sharepoint
  • SQL
  • Virtualization
  • Windbg Scripts
  • Windows
Blog - News

Where Are You Coming From Today?

Where are you now?

Follow us on:

Options
  • Blog Home
  • About
  • Share this
  • RSS for posts
  • Atom
  • RSS for comments
Archive
Archives
  • May 2013 (4)
  • April 2013 (5)
  • March 2013 (6)
  • February 2013 (3)
  • January 2013 (3)
  • December 2012 (2)
  • November 2012 (1)
  • October 2012 (4)
  • September 2012 (5)
  • August 2012 (2)
  • July 2012 (2)
  • June 2012 (3)
  • May 2012 (13)
  • April 2012 (6)
  • March 2012 (6)
  • February 2012 (4)
  • January 2012 (7)
  • December 2011 (11)
  • October 2011 (6)
  • September 2011 (1)
  • August 2011 (3)
  • July 2011 (7)
  • June 2011 (6)
  • May 2011 (5)
  • April 2011 (2)
  • March 2011 (13)
  • February 2011 (1)
  • January 2011 (5)
  • December 2010 (6)
  • November 2010 (1)
  • October 2010 (6)
  • September 2010 (2)
  • August 2010 (3)
  • July 2010 (3)
  • June 2010 (5)
  • May 2010 (1)
  • April 2010 (10)
  • March 2010 (21)
  • February 2010 (8)
  • January 2010 (3)
  • December 2009 (5)
  • November 2009 (5)
  • October 2009 (6)
  • September 2009 (8)
  • August 2009 (9)
  • July 2009 (1)
  • June 2009 (3)
  • May 2009 (2)
  • April 2009 (7)
  • March 2009 (4)
  • February 2009 (7)
  • January 2009 (7)
  • December 2008 (8)
  • November 2008 (7)
  • October 2008 (22)
  • September 2008 (17)
  • August 2008 (13)
  • July 2008 (11)
  • June 2008 (7)
  • May 2008 (3)
  • April 2008 (2)
  • March 2008 (6)
  • January 2008 (4)
  • December 2007 (9)
  • November 2007 (4)
  • October 2007 (3)
  • September 2007 (8)
  • August 2007 (4)
  • July 2007 (2)
  • June 2007 (5)
  • May 2007 (7)
  • April 2007 (9)
  • March 2007 (7)
  • February 2007 (6)
  • January 2007 (4)
  • December 2006 (14)
  • November 2006 (10)
  • October 2006 (10)
  • September 2006 (11)
  • August 2006 (15)
  • July 2006 (7)
  • June 2006 (14)
  • May 2006 (22)
  • April 2006 (16)
  • March 2006 (20)
  • January 2006 (1)

Resposta ao Desafio da Semana #7 [Hang de Alta CPU em C#/VB.NET]

TechNet Blogs > LATAM Team blog > Resposta ao Desafio da Semana #7 [Hang de Alta CPU em C#/VB.NET]

Resposta ao Desafio da Semana #7 [Hang de Alta CPU em C#/VB.NET]

LatamBlog
7 Jul 2006 5:00 PM
  • Comments 1

Por: Roberto Alexis Farah

 

Eis a resposta ao Desafio da Semana 7.

Veja o link com a definição do desafio aqui: 

 

 

PROBLEMA

 

O problema é que o código erroneamente assumia que a string recebida como parâmetro sempre tinha um número.

Portanto, o loop varre os caracteres da string até encontrar um número, quando não há número o loop nunca é terminado, ou seja, loop infinito causando alto consumo de CPU.

Note que além do problema de se assumir que a string continha números, o código também não preve a situação onde a string está vazia, ocasionando o mesmo loop infinito!

Assim, embora o código funcione na maioria das vezes ele vai falhar quando a string for vazia ou não houver números dentro dela, gerando o sintoma de alta CPU.

 

SOLUÇÃO

 

Mesmo sem ter uma especificação sobre o que o código deveria fazer e como deveria reagir é possível se concluir que, se deveria processar strings sem número, ele não faz isso. E se deveria rejeitar strings sem números, ele também não faz isso.

No caso, supondo-se que a idéia seja de se evitar strings sem números (e vazias), uma possível solução seria:

 

     'Exemplo de parametros:

     'ABC!DEF#45GH

     'ABC!DEFxxxxAAAGH1

     '4fgfgjfdhg3fdgjfgjh1

     Public Function Crypto(ByVal someString As String) As String

              ' Inicializa a semente de nuvero aleatorio para sempre ser diferente.

              VBMath.Randomize()

 

 

 

              ' FIX: Verifica se ha numeros na string.

              ' Tambem evita a situacao de string vazia!

              ' Abordagem pouco invasiva, nao foi necessario se alterar o algoritmo original.

             ' FIX 2: Antes testa se string e´objeto NULL.

              If someString = Nothing OrElse Not Regex.IsMatch(someString, "[0-9]") Then

                   Debug.Assert(True, "someString nao tem caracteres numericos")

 

' Pode-se logar mensagem no Event Viewer antes…

                   Return vbNullString

              End If

 

 

 

              Dim num1 As Long = Strings.Len(someString)

 

              ' Cria uma chave usando um numero aleatorio e o tamanho da string.

              ' O numero nunca e' maior que o tamanho da string.

              Dim text1 As String = StringType.FromLong(CType(Math.Round(CType(((num1 * VBMath.Rnd) + 1.0!), Double)), Long))

 

              ' Varre os caracteres da string apenas.

              Do While Not Char.IsNumber(CharType.FromString(Strings.Mid(someString, IntegerType.FromString(text1), 1)))

                     ' Efetua a mesma conversao.

                     text1 = StringType.FromLong(CType(Math.Round(CType(((num1 * VBMath.Rnd) + 1.0!), Double)), Long))

              Loop

 

              Crypto = text1

     End Function

 

 

Como curiosidade explicarei como o problema foi isolado no cenário real. Primeiro foi necessário se identificar via Performance Monitor quem eram os processos e threads consumindo alta CPU.

Em seguida coletei um Hang Dump do processo. A análise automatizada revelou a pilha (stack) das threads executando o código suspeito e, em seguida, disparando o Garbage Collector.

A primeira vista alguns pensaram que era um problema no GC. Na verdade, o GC estava sendo disparado justamente pelo número de threads travadas no loop.

Após isso, depurei o dump manualmente e extrai o assembly a partir do dump e converti o código do método suspeito para VB.NET.

O código era bastante complexo com muitas operações e conversões. Entretanto, via o dump foi possível se extrair a string usada como parâmetro, analisar o código e entender como a string seria processada. A string não continha caracteres numéricos.

 

Como recomendação embasada por diversos livros de programação;depuração e fazendo minhas as palavras do meu amigo Waldemir Cambiucci, consultor senior da MCS em São Paulo, coloco: Nunca assuma!

 

Nunca assuma quando investigando um problema e nunca assuma quando programando. Para isso, quando você considera que uma situação nunca deveria ocorrer, use Assert, seja em VB.NET, C++, C ou C# para que você receba uma notificação se o que você assumiu como verdadeiro for falso (modo Debug) e eventualmente você pode prevenir problemas em versões Release testando a condição e registrando uma mensagem no Event Viewer, por exemplo.

 

Programando proativamente, usando Assert e trace (logs) ajuda a se evitar bugs e a pegá-los mais rapidamente.

No código original, o simples uso de Assert teria feito o problema ser identificado quando testado em modo debug e o uso de mensagens de trace teria tornado fácil identificar o problema em ambiente de produção.

 

Eis alguns links sobre o assunto:

 

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsdebug/html/_core_Debugging_Assertions.asp

 

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsdebug/html/vxtskverifyingassertionsinmanagedcode.asp

 

http://msdn.microsoft.com/msdnmag/issues/01/10/bugslayer/

 

http://msdn.microsoft.com/msdnmag/issues/05/11/Bugslayer/default.aspx

 

 

 

  • 1 Comments
Desenvolvimento , Performance, Hang
Comments
Comments
  • Roberto Farah
    14 Jul 2006 10:38 PM
    Pessoal, fiz uma importante correção no algoritmo que me ocorreu ao corrigir a mesma falha num código de um cliente e me dar conta que deixei passar na resposta! É necessário sempre se testar se o objeto é válido.
    Ufa, felizmente ninguém achou esse bug antes :)

    Obrigado.
Page 1 of 1 (1 items)
  • © 2013 Microsoft Corporation.
  • Terms of Use
  • Trademarks
  • Privacy & Cookies
  • 5.6.426.415
  • TechNet
  • Products
  • IT Resources
  • Downloads
  • Training
  • Support
Products
  • Windows
  • Windows
    Server
  • System
    Center
  • Internet
    Explorer
 
  • Office
  • Office 365
  • Exchange
    Server
 
  • SQL Server
  • SharePoint
    Products
  • Lync
  • See all products »
Resources
  • Evaluation Center
  • Learning Resources
  • Microsoft IT Camps
  • Microsoft Technical Communities
  • Microsoft Virtual Academy
  • Script Center
  • Server and Tools Blogs
  • Solution Accelerators
  • TechNet Blogs
 
  • TechNet Flash Newsletter
  • TechNet Gallery
  • TechNet Library
  • TechNet Magazine
  • TechNet Subscriptions
  • TechNet Video
  • TechNet Wiki
  • Windows Sysinternals
  • Virtual Labs
Solutions
  • Networking
  • Cloud and Datacenter
  • Security
  • Virtualization
Updates
  • Service Packs
  • Security Bulletins
  • Microsoft Update
Trials
  • Windows Server 2012
  • System Center 2012 SP1
  • Microsoft SQL Server 2012 SP1
  • Windows 8 Enterprise
  • See all trials »
Related Sites
  • Microsoft Download Center
  • TechNet Evaluation Center
  • Drivers
  • Compatability & Converters
  • Windows Sysinternals
  • TechNet Gallery
Training
  • Training Catalog
  • Class Locator
  • Microsoft Virtual Academy
  • Free Windows Server 2012 courses
  • Free Windows 8 courses
  • SQL Server training
  • e-Learning overview
Certifications
  • Certification overview
  • MCSA: Windows 8
  • Windows Server Certification (MCSE)
  • Private Cloud Certification (MCSE)
  • SQL Server Certification (MCSE)
Other resources
  • TechNet Events
  • Second shot for certification
  • Born To Learn blog
  • IT Camps
Support by product
  • Exchange Server
  • Forefront Server
  • Forefront Edge Security
  • Forefront Server Security
  • Internet Explorer
  • Office
  • SharePoint
 
  • SQL Server
  • System Center
  • Windows Server
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
Other support links
  • Microsoft Premier Online
  • Microsoft Fix It Center
  • TechNet Forums
  • MSDN Forums
  • Security Bulletins & Advisories
  • International support solutions
  • Log a support ticket
  • Look up event IDs and error codes
Not an IT pro?
  • Microsoft Customer Support
  • Microsoft Community Forums