Memória e debugação Ricardo Rabelo 25/08/2003. Roteiro Debugação de Código Debugação de Memória Economia de Memória.

Slides:



Advertisements
Apresentações semelhantes
Curso de aprofundamento na linguagem C
Advertisements

... para pessoas que não sabem c++
C/C++ para Sistemas Operacionais Professor: André Luis Meneses Silva /msn: Página:
Introdução à Ciência da Computação Linguagens de Programação.
Programação em Java Prof. Maurício Braga
1 Programação Orientada aos COMponentes Quartas à Tarde no DEI 12 de Abril de 2000.
professor Victory Fernandes
Vamos abordar o exemplo
Introdução à Computação para o Ensino Médio
Polimorfismo e Acoplamento Dinâmico
Rohit Gheyi Alloy & Alloy Analyzer Rohit Gheyi
Banco de Dados Oracle AESO.
Ferramentas de Desenvolvimento
Linguagens de programação
Tutorial de Desenvolvimento uClinux
UNIX.
Complexidade de Algoritmos
Tutorial Condor Juliano Freitas da Silva
Formação Makefiles Ricardo Miranda Guillaume Riflet.
Revisão da Linguagem C.
Conhecendo o Visual Studio.NET
Aluno: Angelo Ferreira Assis
Prof. André Leon S. Gradvohl, Dr.
Introdução a programação (if669cc)
Network Simulator (ns) Carlos Alberto Kamienski Djamel Sadok Joseane Farias Fidalgo Cin-UFPE.
Desenvolvimento de Jogos e Entretenimento Digital
Desenvolvendo para a web com Grails
Python: Módulos Claudio Esperança.
Linguagens de Programação
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
Estrutura Interna - Classes
Curso de NS Rainer R. P. Couto
Tópicos Avançados em Redes de Computadores Recife, 13 de Novembro de 2009.
Revisão de Orientação a Objetos e C++
Shell Script Bruno dos Santos Bermann
Developed by Virtutech Apresentação feita por: Carlos Ferreira Inês Ramos.
Apresentação Shell Script
Instrumento Virtual LabVIEW
Programação de SCRIPTS
Cristiano Soares Rafael di Lego Roberto Nemirovsky Thiago Nascimento
Capítulo 5 Garbage Collector.
Ambiente de Execução - Rotinas
Treinamento Framework PRADO Abril / Sobre o PRADO Estrutura de diretórios do PRADO Configuração da Aplicação Padrões utilizados na Conab Boas práticas.
Aula 1 - Fundamentos Java SE Instituto Metodista Izabela Hendrix Curso de Tecnologia em Análise e Desenvolvimento de Sistemas Prof. Gilmar Medeiros – Agosto/2009.
Capítulo VIII Ambientes de Execução
Paradigmas da Programação – Semestre 1 – Aula 9 Professor: Eduardo Mantovani )
Go3D! A 3D Graphics Engine Carlos Tosin. Divisão Estrutura dividida em 4 componentes Core (46 classes) Áudio (4 classes) Script (4 classes) Renderer (37.
PROGRAMAÇÃO CONCORRENTE E SISTEMAS OPERACIONAIS Programação Concorrente e Sistemas Operacionais Edison Ishikawa
Regras de escopo Escopo: trecho de codificação no qual o identificador possui significado Escopo de função: identificador válido dentro do trecho de uma.
Aula Prática 3 Monitoria IP/CC (~if669). Relembrando Padronização Comentários Identação Significado em nomes de variáveis Depuração de Erros.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014 Capítulo I Comandos Simples e Repetições.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo I Comandos Simples e Repetições.
1 Universidade Federal de Santa Catarina Uma Ferramenta de Suporte a Simulação de Redes com o ns-2 Adriano Orlando Campestrini Florianópolis
Construtores e Destrutores
Flávia Falcão Java Performance Flávia Falcão
Disciplina: Ordenação e Pesquisa Prof.(a): Miriam Monteiro Equipe: Mariane Oliveira Dias Palloma Dikassia Simone Martins Werley Batista.
GERENCIAMENTO DE MEMÓRIA EM JAVA ALUNOS: ANTÔNIO FLÁVIO(in memorian) E HEDLEY LUNA.
Ambiente de desenvolvimento Curso de Nivelamento LCG
GARBAGE COLLECTOR 1 UNIVERSIDADE FEDERAL DO PARÁ - UFPA.
A High Performance Java Middleware with a Real Application HUERT, Fabrice; CAROMEL, Denis; Bal, Henri E. Supercomputing 2004 Trabalho desenvolvido por:
Linguagem técnica de programação I Java
Engenharia de Sistemas Embarcados Aula 5: Um Conjunto Básico de Ferramentas.
Estrutura de Dados II Alocação Dinâmica. Alocação de memória Ao ser executado, um programa carrega seu código executável para a memória; Uma parte da.
Treinamento AJAX Waelson Negreiros Blog:
MatLab (Matrix Laboratory)
Computadores vs. Programas / Algoritmos Computadores vs. Programas -> Algoritmos O tratamento de problemas através do computador geralmente envolve uma.
Linguagem de Programação
CURSO JAVA BÁSICO Módulo 9 – slide 1 Módulo 10 Threads.
Laboratório de Computação Aula 06 e 07 – Implementação de classes Prof. Fábio Dias
Lab2: PROGRAMANDO COM SCRIPTS Dilvan Moreira. Utilizando PyScripter  Dentro da pasta do Python na sua pendrive  Acesse “PyScripter-Portable.exe”
Transcrição da apresentação:

Memória e debugação Ricardo Rabelo 25/08/2003

Roteiro Debugação de Código Debugação de Memória Economia de Memória

OTcl Versus C++ Granularidade do código/script pode ser ajustada para compensar extensibilidade por performance. Tamanho do programa complexidade C/C++ OTcl grande pequeno split objects

Escalabilidade vs Flexibilidade Escrever todo o código em OTcl é tentador Benficio: prototipagem rápida Custo: memória + runtime Solução Controle da granuliridade do slipt object migrando os métodos de Otcl para C++

Debugação Código Duas linguagens mescladas == debugação mesclada Uso de printf (C/C++) e puts (OTcl) Problemas: recompilar o código e gerar novos cenários a cada execução. Mas é simples Uso do gdb Acompanhar a execução passo a passo do código. Complica quando mescla os diferentes ambientes: C/C++ e OTcl

Debugação Código No arquivo Makefile.in, adicionar a compilação do código objeto com o fonte CFLAGS = $(CCOPT) $(DEFINE) –ggdb Executar o./configure gdb ns

Debugação Código Setar os breakpoints: (gdb) b classifier-addr.cc:47 (gdb) b AddressClassifier::AddressClassifier Executar o programa (gdb) run Starting program: /ns/ns-2/ns... Breakpoint 1, AddressClassifier::AddressClassifier (this=0x12fbd8) at classifier-addr.cc:47 (gdb)

Debugação Código Comandos básicos gdb b -> coloca um breakpoint list -> mostra as próximas 10 linhas de código display -> watch nas variáveis help -> listar todos os outros comandos

Debugação Código Debugação do Otcl Ferramenta Expect: Compilada junto com o NS, no mesmo diretório Chamada através do comando debug 1 dentro do script que está sendo executado

Debugação Código Debugação mesclada: gdb e expect Chamar a debugação Tcl a partir do ambiente do gdb

Debugação Código (gdb) run Starting program: /ns/ns-2/ns... Breakpoint 1, AddressClassifier::AddressClassifier (this=0x12fbd8) at classifier-addr.cc:47 (gdb) p this->name_ $1 = 0x2711e8 "_o73 (gdb) call Tcl::instance().eval("debug 1") 15: lappend auto_path $dbg_library dbg15.3> w *0: application 15: lappend auto_path /usr/local/lib/dbg dbg15.4> Simulator info instances o1 dbg15.5> _o1 now 0 dbg15.6> _o73 info class Classifier/Addr dbg15.7> _o73 info vars slots_ shift_ off_ip_ offset_ off_flags_ mask_ off_cmn_ dbg15.8> c (gdb) w Ambiguous command "w": while, whatis, where, watch. (gdb) where #0 AddressClassifier::AddressClassifier (this=0x12fbd8) at classifier-addr.cc:47 #1 0x5c68 in AddressClassifierClass::create (this=0x10d6c8, argc=4, argv=0xefffcdc0) at classifier-addr.cc:63... (gdb)

Debugação Memória Otcl Tcl, TclCL não possuem garbage collector. Novos objetos perdidos na memória podem causar memory leaks. Mesmo ferramentas de auxilio a alocação de memória não auxiliam set ns [new Simulator] for {set i 0} {$i < 500} {incr i} { set a [new RandomVariable/Constant] } Objetos perdidos após a execução do for Para lidar com isso, todos os objetos alocados em Otcl devem ser desalocados explicitamente, no fim da simulação

Debugação Memória Purify Set PURIFY macro in ns Makefile Usually, put -colloctor= dmalloc make distclean./configure --with-dmalloc= Resultados: dmalloc_summarize

Debugação Memória Uso do dmalloc: 1. Definir um alias 1. (csh: alias dmalloc 'eval `\dmalloc -C \!*`', bash: function dmalloc { eval `command dmalloc -b $*` }) 2. Ativar a debugação 1. dmalloc -l logfile low 3. Executar o programa 4. Intepretar o logfile com o script 1. dmalloc_summarize ns <logfile (dmalloc_summarize : ) 5. Um relatório do uso de memória é gerado 6. Em algumas plataformas é necessário fazer a lincagem do código estática

Debugação Memória Exemplo ns-2/tcl/ex/newmcast/cmcast-100.tcl script com um comando de sair após a criação do duplex-link de número 200 size function total TclObject::bind(char const *, int *) StringCreate NewVar Ns aloca ~6MB de memória. ~1MB is devido a TclObject::bind ~900KB de StringCreate ~700KB de NewVar

Debugação Memória dmalloc com gdb: colocar um breakpoint na função dmalloc_error(). Se o código possui bibliotecas compartilhadas, é necessário dar o comando (gdb) sharedlibrary (gdb) add-shared-symbol-files

Debugação Memória Dmalloc_summarize mapeia o nome das funções a as respectias areás de memória. Para a identificaçãod dos nomes, é necessário compliar de maneira estatíca. Programas com dmalloc tendem a gastar muito mais memória, devido a inserção do código. Dmalloc também pode verificar diversos tipos de erros de memória (frees duplicados, buffer overruns, etc.). Documentação:

Economia de Memória A memória é um fator vital numa simulação no NS O consumo pode chegar a uma ordem exponencial Melhor otimizar o código do que ter mais memória C++ versus OTcl

Economia de Memória Evitar trace-all O comando $ns trace-all $f faz com que todos os objetos, nodos e links gerem eventos para o trace. Caso o interesse da análise esteja em um ou poucos links, não é necessário utilizar tantos. A economia de memória é em torno de 14 KB/link. Uso de vetores para sequência de variáveis. Ao invés de set n$i [$ns node] Usar set n($i) [$ns node] Economia de aproximadamente 50 Bytes/variável.

Economia de Memória Maximizar o uso do C++ sempre que possivel portar o código para C++. E evitar o uso de bind() de variaveis devido ao alto custo de alocação. Evitar o uso de variáveis desnecessárias Ao invés de set cmcast(1) [new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]] Usar new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1] A economia é de 80 Byte/variável

Economia de Memória Uso de dynamic binding O uso do bind() em C++ consome muita memória e tempo de execução. E fica muito mais caro se uma grande quantidade de objetos do mesmo tipo forem instanciados. Mudando os bind()'s para delay_bind() muda os requerimentos de memória por classes. Cabeçalho dos pacotes Por padrão, em todas as simulações todos os cabeçalhos de pacotes são carregados. Nesse caso é uma grande economia de memória remover todos os pacotes e adicionar apenas os necessários: remove-all-packet-headers ;# removes all except common add-packet-header IP Message ;# hdrs reqd for cbr traffic

Economia de Memória Exemplo de economia de memória com o remove-all-packet (Pentium-II, 448 MHz 1GB RAM 4GB hd Linux redhat-7.0.) Cenários com 2 nodos conectados por um link de grande atraso e banda passante (~ns/tcl/ex/pkts.tcl) BW = 1Gbps, Delay=100ms,Agent= UDP, traffic source=CBR, pacotes de 210 a uma taxa de 1Gbps: 10 9 * 100 * * 210 = ~59,500 pacotes no link O uso de memória é em torno de 140MB, ~2KB/pkt.

Economia de Memória Removendo todos os cabeçalhos e adicionando apenas os do trafego CBR, o uso de memória vai para ~30MB, 500bytes/pacote. Toda a informação sobre os pacotes adicionados ~ns/tcl/lib/ns-packet.tcl. Mais informações na seção" Including Packet Headers in Your Simulation" no capitulo 12 do manual.

Tempo de execução Evitar trace-all e trace-nam Utilizar endereçamento hierarquico Diminui a quantidade de classifiers alocados Diminui o tempo de montagem das tabelas de rotas Uso de manual routing, em cenários com muitos links (~ns/tcl/ex/many_tcp.tcl )