Pergunta

Estamos produzindo um código portátil (win + MacOS) e nós estamos olhando para a forma de tornar o código mais rubust como ele trava de vez em quando ... (overflows ou maus initializations geralmente): - (

Eu estava lendo que o Google Chrome utiliza um processo para cada guia por isso, se algo der errado, então o programa não falhar compleatelly, única guia que. Eu acho que é bastante puro, para que eu possa dar-lhe um ir!

Então eu queria saber se alguém tem algumas dicas, ajuda, lista de leitura, comentário ou algo que pode me ajudar a construir um código mais rubust c ++ (portátil é sempre melhor).

No mesmo tópico eu estava querendo saber também se existe uma biblioteca portátil para processos (como impulso)?

Bem Muito obrigado.

Foi útil?

Solução

Eu desenvolvi em numerosas aplicações multi-plataforma C ++ (as maiores linhas de ser 1.5M de código e funcionando em 7 plataformas - AIX, HP-UX PA-RISC, HP-UX Itanium, Solaris, Linux, Windows, OS X). Você realmente tem duas questões completamente diferentes em seu post.

  1. A instabilidade. Seu código não é estável. Consertá-lo.

    • Use testes de unidade para encontrar problemas de lógica antes que o matem.
    • Use depuradores para descobrir o que está causando as falhas se não é óbvio.
    • Use impulso e bibliotecas semelhantes. Em particular, os tipos de ponteiro irá ajudar a evitar vazamentos de memória.
  2. codificação de Cross-plataforma.

    • Novamente, bibliotecas de uso que são projetados para isso quando possível. Particularmente para os bits de GUI.
    • Usar padrões (por exemplo, ANSI vs gcc / MSVC, threads POSIX vs modelos de rosca específicas em Unix, etc), tanto quanto possível, mesmo que isso requer um pouco mais de trabalho. Minimizando seus meios de código específico da plataforma de trabalho menos global e menos APIs para aprender.
    • Isole, isolado, isolado. Evite #ifdefs em linha para diferentes plataformas, tanto quanto possível. Em vez disso, o código específico da plataforma vara em seu próprio cabeçalho / fonte / aula e usar o seu sistema de compilação e #includes para obter o código certo. Isso ajuda a manter o código limpo e legível.
    • Use o C99 inteiro tipos, se possível, em vez de "long", "int", "curto", etc - caso contrário ele vai morder você quando você se move de uma plataforma de 32 bits para um de 64 bits um e longs mudar repentinamente a partir de 4 bytes de 8 bytes. E se isso já escrito para a rede / disco / etc, então você vai correr em incompatibilidade entre plataformas.

Pessoalmente, eu estabilizar o código primeiro (sem adicionar mais recursos) e depois lidar com as questões de plataforma cruzada, mas isso é até você. Note que Visual Studio tem um excelente depurador (a base de código mencionado acima foi portado para o Windows apenas por esse motivo).

Outras dicas

A resposta Chrome é mais sobre mitigação falha e não sobre a qualidade do código. Fazendo o Chrome está a fazer é admitir a derrota.

  1. Melhor QA que é mais do que apenas programador testando seu próprio trabalho.
  2. O teste de unidade
  3. O teste de regressão
  4. Leia-se sobre as melhores práticas que outros empresas usam.

Para ser franco, se o seu software está falhando muitas vezes devido a excessos e maus inicializações, então você tem um problema muito básica de qualidade de programação que não vai ser facilmente corrigido. Isso soa um hash e média, que não é minha intenção. Meu ponto é que o problema com o código ruim tem que ser a sua principal preocupação (que eu tenho certeza que ele é). Coisas como Chrome ou o uso liberal de tratamento de exceção para pegar programa de falha só são distraindo-o do problema real.

Você não mencionar o que o projeto de destino é; ter um processo per-guia não significa necessariamente mais código "robusto" em tudo. Você deve apontar para escrever o código sólida com testes independentemente da portabilidade - apenas ler sobre escrever bom código C ++:)

Como para a seção de portabilidade, certifique-se que você está testando em ambas as plataformas desde o primeiro dia e garantir que nenhum código novo é escrito até que os problemas específicos de plataforma são resolvidos.

Você realmente, realmente não quero fazer o que Chrome está fazendo, ele requer um gerenciador de processos que é provavelmente WAY exagero para o que quiser.

Você deve investigar usando ponteiros inteligentes de aumentar ou outra ferramenta que irá fornecer contagem de referência ou coleta de lixo para C ++.

Como alternativa, se você estiver com freqüência batendo você pode querer considerar talvez escrever não-desempenho partes críticas do seu aplicativo em uma linguagem de script que tem ligações C ++.

Scott Meyers' Effective C ++ e Mais Effective C ++ são muito bons, e divertido de ler.

O Steve McConnell código completo é um favorito de muitos, incluindo Jeff Atwood.

As bibliotecas de impulso são, provavelmente, uma excelente escolha. Um projeto onde eu trabalho usa-los. Eu tenho usado apenas Win32 enfiar-me.

Eu concordo com Torlack.

Bad inicialização ou estouros são sinais de código de má qualidade.

O Google fez-lo dessa maneira, porque às vezes, não havia nenhuma maneira de controlar o código que foi executado em uma página (por causa de plugins com defeito, etc.). Então, se você estiver usando plug-ins de baixa qualidade (acontece), talvez a solução Google vai ser bom para você.

Mas um programa sem plugins que cai muitas vezes é apenas mal escrito, ou muito, muito complexa, ou muito velha (e faltando um monte de tempo de manutenção). Você deve parar o desenvolvimento, e investigar cada acidente. No Windows, compilar os módulos com PDBs (bancos de dados do programa), e cada vez que deixa de funcionar, anexar um depurador a ele.

Você deve adicionar testes internos também. Evite o padrão:

doSomethingBad(T * t)
{
   if(t == NULL) return ;

   // do the processing.
}

Isto é muito mau design, porque o erro está lá, e você simplesmente evitá-lo, este tempo . Mas a próxima função sem este guarda irá falhar. Melhor para travar mais cedo para estar mais próximo do erro.

Em vez disso, no Windows (deve haver uma API semelhante sobre MacOS)

doSomethingBad(T * t)
{
   if(t == NULL) ::DebugBreak() ; // it will call the debugger

   // do the processing.
}

(não use este código diretamente ... Coloque-o em um define para evitar entregá-lo a um cliente ...) Você pode escolher a API de erro que lhe convier (exceções, DebugBreak, assert, etc.), mas usá-lo para parar o momento em que o código sabe errado de alguma coisa.

Evite a API C, sempre que possível. Uso C ++ idiomas (RAII, etc.) e bibliotecas.

Etc ..

P.S .: Se você usar exceções (que é uma boa escolha), não escondê-los dentro de um catch. Você só vai fazer o seu problema pior porque o erro está lá, mas o programa vai tentar continuar e provavelmente irá falhar algumas vezes depois, e nada corrupto que toca nesse meio tempo.

Você pode sempre adicionar o tratamento de exceção para o seu programa para pegar esses tipos de falhas e ignorá-los (embora os detalhes são plataforma específica) ... mas isso é muito mais uma espada de dois gumes. Em vez disso considerar ter o programa captura as exceções e criar arquivos de despejo para análise.

Se o seu programa se comportou de uma forma inesperada, o que você sabe sobre o seu estado interno? Talvez a rotina / thread que caiu corrompeu alguma estrutura de dados de chave? Talvez se você pegar o erro e tentar continuar o usuário irá salvar o que eles estão trabalhando e se comprometer a corrupção no disco?

Além de escrever código mais estável, está aqui uma ideia que responde a sua pergunta.

Se você estiver usando processos ou threads. Você pode escrever um programa de vigilância pequeno / simples. Em seguida, seus outros programas registrar com que cão de guarda. Se nenhum morre de processo, ou morre um fio, ele pode ser reiniciado pelo cão de guarda. Claro que você vai querer colocar em algum teste para se certificar de você não manter o reinício do mesmo segmento buggy. ou seja:. reiniciá-lo 5 vezes, em seguida, após o 5º, o desligamento todo o programa e log em arquivo / syslog

Criar seu aplicativo com símbolos de depuração, em seguida, adicione um manipulador de exceção ou configure o Dr. Watson para gerar despejos de memória (run drwtsn32.exe / i para instalá-lo como o depurador, sem a / i para estalar a janela de configuração). Quando seu aplicativo falha, você pode inspecionar onde deu errado no windbg ou visual studio por ver uma pilha de chamadas e variáveis.

O Google para servidor de símbolos para mais informações.

Obviamente, você pode usar o tratamento de exceção para torná-lo mais robusto e usar ponteiros inteligentes, mas corrigir os erros é melhor.

Eu recomendo que você compilar uma versão linux e executá-lo sob Valgrind .

Valgrind vai rastrear vazamentos de memória, a memória não inicializada lê e muitos outros problemas de código. Eu recomendo-lo.

Depois de mais de 15 anos de desenvolvimento do Windows Eu recentemente escrevi meu primeiro C aplicativo de plataforma cruzada ++ (Windows / Linux). Veja como:

  • STL
  • Boost. Em particular, os sistemas de arquivos e linha bibliotecas.
  • Um navegador baseado UI. O aplicativo 'faz' HTTP, com o UI consistindo de CSS JavaScript (estilo Ajax) XHTML / /. Estes recursos são incorporados no código do servidor e serviu para o navegador quando necessário.
  • teste de unidade abundante. Não é bem TDD, mas perto. Isso realmente mudou a forma como eu desenvolvo.

Eu usei NetBeans C ++ para compilação Linux e tinha uma porta cheia Linux em nenhum momento a todos.

construí-lo com a idéia de que a única maneira de sair é para o programa deixe de funcionar e que pode falhar a qualquer momento. Quando você constrói-lo dessa forma, deixando de funcionar Nunca / quase nunca vai perder quaisquer dados. Eu li um artigo sobre isso um ano ou dois atrás. Infelizmente, eu não tenho um link para ele.

Combine isso com algum tipo de despejo de memória e tê-lo-mail que você para que você possa corrigir o problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top