⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gprof.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1983, 1993 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char copyright[] ="@(#) Copyright (c) 1983, 1993\n\	The Regents of the University of California.  All rights reserved.\n";#endif /* not lint */#ifndef lintstatic char sccsid[] = "@(#)gprof.c	8.1 (Berkeley) 6/6/93";#endif /* not lint */#include "gprof.h"char	*whoami = "gprof";    /*     *	things which get -E excluded by default.     */char	*defaultEs[] = { "mcount" , "__mcleanup" , 0 };static struct gmonhdr	gmonhdr;main(argc, argv)    int argc;    char **argv;{    char	**sp;    nltype	**timesortnlp;    --argc;    argv++;    debug = 0;    bflag = TRUE;    while ( *argv != 0 && **argv == '-' ) {	(*argv)++;	switch ( **argv ) {	case 'a':	    aflag = TRUE;	    break;	case 'b':	    bflag = FALSE;	    break;	case 'C':	    Cflag = TRUE;	    cyclethreshold = atoi( *++argv );	    break;	case 'c':#if defined(vax) || defined(tahoe)	    cflag = TRUE;#else	    fprintf(stderr, "gprof: -c isn't supported on this architecture yet\n");	    exit(1);#endif	    break;	case 'd':	    dflag = TRUE;	    setlinebuf(stdout);	    debug |= atoi( *++argv );	    debug |= ANYDEBUG;#	    ifdef DEBUG		printf("[main] debug = %d\n", debug);#	    else not DEBUG		printf("%s: -d ignored\n", whoami);#	    endif DEBUG	    break;	case 'E':	    ++argv;	    addlist( Elist , *argv );	    Eflag = TRUE;	    addlist( elist , *argv );	    eflag = TRUE;	    break;	case 'e':	    addlist( elist , *++argv );	    eflag = TRUE;	    break;	case 'F':	    ++argv;	    addlist( Flist , *argv );	    Fflag = TRUE;	    addlist( flist , *argv );	    fflag = TRUE;	    break;	case 'f':	    addlist( flist , *++argv );	    fflag = TRUE;	    break;	case 'k':	    addlist( kfromlist , *++argv );	    addlist( ktolist , *++argv );	    kflag = TRUE;	    break;	case 's':	    sflag = TRUE;	    break;	case 'z':	    zflag = TRUE;	    break;	}	argv++;    }    if ( *argv != 0 ) {	a_outname  = *argv;	argv++;    } else {	a_outname  = A_OUTNAME;    }    if ( *argv != 0 ) {	gmonname = *argv;	argv++;    } else {	gmonname = GMONNAME;    }	/*	 *	turn off default functions	 */    for ( sp = &defaultEs[0] ; *sp ; sp++ ) {	Eflag = TRUE;	addlist( Elist , *sp );	eflag = TRUE;	addlist( elist , *sp );    }	/*	 *	get information about a.out file.	 */    getnfile();	/*	 *	get information about mon.out file(s).	 */    do	{	getpfile( gmonname );	if ( *argv != 0 ) {	    gmonname = *argv;	}    } while ( *argv++ != 0 );	/*	 *	how many ticks per second?	 *	if we can't tell, report time in ticks.	 */    if (hz == 0) {	hz = 1;	fprintf(stderr, "time is in ticks, not seconds\n");    }	/*	 *	dump out a gmon.sum file if requested	 */    if ( sflag ) {	dumpsum( GMONSUM );    }	/*	 *	assign samples to procedures	 */    asgnsamples();	/*	 *	assemble the dynamic profile	 */    timesortnlp = doarcs();	/*	 *	print the dynamic profile	 */    printgprof( timesortnlp );		/*	 *	print the flat profile	 */    printprof();		/*	 *	print the index	 */    printindex();	    done();}    /*     * Set up string and symbol tables from a.out.     *	and optionally the text space.     * On return symbol table is sorted by value.     */getnfile(){    FILE	*nfile;    int		valcmp();    nfile = fopen( a_outname ,"r");    if (nfile == NULL) {	perror( a_outname );	done();    }    fread(&xbuf, 1, sizeof(xbuf), nfile);    if (N_BADMAG(xbuf)) {	fprintf(stderr, "%s: %s: bad format\n", whoami , a_outname );	done();    }    getstrtab(nfile);    getsymtab(nfile);    gettextspace( nfile );    qsort(nl, nname, sizeof(nltype), valcmp);    fclose(nfile);#   ifdef DEBUG	if ( debug & AOUTDEBUG ) {	    register int j;	    for (j = 0; j < nname; j++){		printf("[getnfile] 0X%08x\t%s\n", nl[j].value, nl[j].name);	    }	}#   endif DEBUG}getstrtab(nfile)    FILE	*nfile;{    fseek(nfile, (long)(N_SYMOFF(xbuf) + xbuf.a_syms), 0);    if (fread(&ssiz, sizeof (ssiz), 1, nfile) == 0) {	fprintf(stderr, "%s: %s: no string table (old format?)\n" ,		whoami , a_outname );	done();    }    strtab = calloc(ssiz, 1);    if (strtab == NULL) {	fprintf(stderr, "%s: %s: no room for %d bytes of string table\n",		whoami , a_outname , ssiz);	done();    }    if (fread(strtab+sizeof(ssiz), ssiz-sizeof(ssiz), 1, nfile) != 1) {	fprintf(stderr, "%s: %s: error reading string table\n",		whoami , a_outname );	done();    }}    /*     * Read in symbol table     */getsymtab(nfile)    FILE	*nfile;{    register long	i;    int			askfor;    struct nlist	nbuf;    /* pass1 - count symbols */    fseek(nfile, (long)N_SYMOFF(xbuf), 0);    nname = 0;    for (i = xbuf.a_syms; i > 0; i -= sizeof(struct nlist)) {	fread(&nbuf, sizeof(nbuf), 1, nfile);	if ( ! funcsymbol( &nbuf ) ) {	    continue;	}	nname++;    }    if (nname == 0) {	fprintf(stderr, "%s: %s: no symbols\n", whoami , a_outname );	done();    }    askfor = nname + 1;    nl = (nltype *) calloc( askfor , sizeof(nltype) );    if (nl == 0) {	fprintf(stderr, "%s: No room for %d bytes of symbol table\n",		whoami, askfor * sizeof(nltype) );	done();    }    /* pass2 - read symbols */    fseek(nfile, (long)N_SYMOFF(xbuf), 0);    npe = nl;    nname = 0;    for (i = xbuf.a_syms; i > 0; i -= sizeof(struct nlist)) {	fread(&nbuf, sizeof(nbuf), 1, nfile);	if ( ! funcsymbol( &nbuf ) ) {#	    ifdef DEBUG		if ( debug & AOUTDEBUG ) {		    printf( "[getsymtab] rejecting: 0x%x %s\n" ,			    nbuf.n_type , strtab + nbuf.n_un.n_strx );		}#	    endif DEBUG	    continue;	}	npe->value = nbuf.n_value;	npe->name = strtab+nbuf.n_un.n_strx;#	ifdef DEBUG	    if ( debug & AOUTDEBUG ) {		printf( "[getsymtab] %d %s 0x%08x\n" ,			nname , npe -> name , npe -> value );	    }#	endif DEBUG	npe++;	nname++;    }    npe->value = -1;}    /*     *	read in the text space of an a.out file     */gettextspace( nfile )    FILE	*nfile;{    if ( cflag == 0 ) {	return;    }    textspace = (u_char *) malloc( xbuf.a_text );    if ( textspace == 0 ) {	fprintf( stderr , "%s: ran out room for %d bytes of text space:  " ,			whoami , xbuf.a_text );	fprintf( stderr , "can't do -c\n" );	return;    }    (void) fseek( nfile , N_TXTOFF( xbuf ) , 0 );    if ( fread( textspace , 1 , xbuf.a_text , nfile ) != xbuf.a_text ) {	fprintf( stderr , "%s: couldn't read text space:  " , whoami );	fprintf( stderr , "can't do -c\n" );	free( textspace );	textspace = 0;	return;    }}    /*     *	information from a gmon.out file is in two parts:     *	an array of sampling hits within pc ranges,     *	and the arcs.     */getpfile(filename)    char *filename;{    FILE		*pfile;    FILE		*openpfile();    struct rawarc	arc;    pfile = openpfile(filename);    readsamples(pfile);	/*	 *	the rest of the file consists of	 *	a bunch of <from,self,count> tuples.	 */    while ( fread( &arc , sizeof arc , 1 , pfile ) == 1 ) {#	ifdef DEBUG	    if ( debug & SAMPLEDEBUG ) {		printf( "[getpfile] frompc 0x%x selfpc 0x%x count %d\n" ,			arc.raw_frompc , arc.raw_selfpc , arc.raw_count );	    }#	endif DEBUG

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -