??xml version="1.0" encoding="utf-8" standalone="yes"?>香蕉99久久国产综合精品宅男自 ,久久久久久亚洲精品不卡,亚洲AV日韩精品久久久久http://www.shnenglu.com/loky/archive/2008/12/27/70480.html。。。?/dc:creator>。。。?/author>Fri, 26 Dec 2008 16:36:00 GMThttp://www.shnenglu.com/loky/archive/2008/12/27/70480.htmlhttp://www.shnenglu.com/loky/comments/70480.htmlhttp://www.shnenglu.com/loky/archive/2008/12/27/70480.html#Feedback0http://www.shnenglu.com/loky/comments/commentRss/70480.htmlhttp://www.shnenglu.com/loky/services/trackbacks/70480.html gcc g++ 常用~译选项
       Linux中gccQg++常用~译选项
-x language filename
讑֮文g所使用的语a,使后~名无?对以后的多个有效.也就是根据约定,C语言的后~名称?c的,而C++的后~名是.C或?cpp,如果你很? 性,军_你的C代码文g的后~名是.pig 哈哈Q那你就要用q个参数,q个参数对他后面的文件名都v作用Q除非到?jin)下一个参数的使用。可以用的参数有下面的q些Q?
  `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a
ssembler-with-cpp'.
  看到英文Q应该可以理解的?br> 
  例子用法: cd..
  gcc -x c hello.pig

-x none filename
  x上一?a name="baidusnap4">

/* 注释中的不常?***************************************************

-fno-asm
  此选项实现ansi
选项的功能的一部分Q它止asm,inline和typeof用作关键字?
    
-fno-strict-prototype
  只对gQ+起作?使用q个
选项,g++对不带参数的函?都认为是没有昑ּ的对参数的个数和cd说明,而不是没有参?
  而gcc无论是否使用q个参数,都将Ҏ(gu)有带参数的函?认ؓ(f)没有昑ּ说明的类?

  
-fthis-is-varialble
  是向传lc++看齐,可以使用this当一般变量?
  
-fcond-mismatch
  允许条g表达式的W二和第三参数类型不匚w,表达式的值将为voidcd
  
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
  q四个参数是对charcdq行讄,军_charcd讄成unsigned char(前两个参
?或?signed char(后两个参?

*注释完成*********************************************/  

-include file
  包含某个代码,单来?是便于某个文g需要另一个文件的时?可以用它设
?功能q当于在代码中使用Qi nclude<filename>
  例子用法:
  gcc hello.c -include /root/pianopan.h
  
-imacros file
  file文g的宏,扩展到gcc/g++的输入文?宏定义本wƈ不出现在输入文g?
  
-Dmacro
  相当于C语言中的#define macro
  
-Dmacro=defn
  相当于C语言中的#define macro=defn
  
-Umacro
  相当于C语言中的#undef macro
-undef
  取消对Q何非标准宏的定义
  
-Idir
  在你是用Qi nclude"file"的时?gcc/g++?x)先在当前目录查找你所制定的头文g,?
果没有找?他回到缺省的头文件目录找,如果使用-I制定?jin)目??
  回先在你所制定的目录查?然后再按常规的顺序去?
  对于Qi nclude<file>,gcc/g++?x)?I制定的目录查?查找不到,然后到pȝ的缺
省的头文件目录查?
  
-I-
  是取消前一个参数的功能,所以一般在-Idir之后使用
  
-idirafter dir
  ?I的目录里面查扑֤?讲到q个目录里面查找.
  
-iprefix prefix
-iwithprefix dir
  一般一起??I的目录查扑֤??x)到prefix+dir下查?
  
-nostdinc
  使编译器不再pȝ~省的头文g目录里面扑֤文g,一般和-I联合使用,明确限定?
文g的位|?
  
-nostdin C++
  规定不在g++指定的标准\l中搜烦(ch),但仍在其他\径中搜烦(ch),.?strong style="background-color: #ff66ff;">选项在创libg++?
使用
  
-C
  在预处理的时?不删除注释信?一般和-E使用,有时候分析程序,用这个很方便?


-M
  生成文g兌的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c
来测试一下,很简单?
  
-MM
  和上面的那个一P但是它将忽略由#i nclude<file>造成的依赖关pR?
  
-MD
  ?M相同Q但是输出将导入?d的文仉?
  
-MMD
  ?MM相同Q但是输出将导入?d的文仉?
  
-Wa,option
  ?strong style="background-color: #ff66ff;">选项传递optionl汇~程?如果option中间有逗号,将option分成多个选项,?
后传递给?x)汇~程?
  
-Wl.option
  ?strong style="background-color: #ff66ff;">选项传递optionl连接程?如果option中间有逗号,将option分成多个选项,?
后传递给?x)连接程?
  
-llibrary
  制定~译的时候用的?
  例子用法
  gcc -lcurses hello.c
  使用ncurses库编译程?
  
-Ldir
  制定~译的时候,搜烦(ch)库的路径。比如你自己的库Q可以用它制定目录,不然
  ~译器将只在标准库的目录找。这个dir是目录的名U?
  
-O0
-O1
-O2
-O3
  ~译器的优化选项?个别,-O0表示没有优化,-O1为缺省|-O3优化U别最高 
    
-g
  只是~译器,在编译的时候,产生调试信息?
  
-gstabs
  ?strong style="background-color: #ff66ff;">选项以stabs格式声称调试信息,但是不包括gdb调试信息.
  
-gstabs+
  ?strong style="background-color: #ff66ff;">选项以stabs格式声称调试信息,q且包含仅供gdb使用的额外调试信?
  
-ggdb
  ?strong style="background-color: #ff66ff;">选项尽可能的生成gdb的可以用的调试信息.
-static
  ?strong style="background-color: #ff66ff;">选项禁止用动态库Q所以,~译出来的东西,一般都很大Q也不需要什?
动态连接库Q就可以q行.
-share
  ?strong style="background-color: #ff66ff;">选项尽量用动态库Q所以生成文件比较小Q但是需要系l由动态库.
-traditional
  试图让编译器支持传统的C语言Ҏ(gu)?/font>



]]>
析Linux下core文g http://www.shnenglu.com/loky/archive/2008/12/10/69106.html。。。?/dc:creator>。。。?/author>Wed, 10 Dec 2008 13:23:00 GMThttp://www.shnenglu.com/loky/archive/2008/12/10/69106.htmlhttp://www.shnenglu.com/loky/comments/69106.htmlhttp://www.shnenglu.com/loky/archive/2008/12/10/69106.html#Feedback0http://www.shnenglu.com/loky/comments/commentRss/69106.htmlhttp://www.shnenglu.com/loky/services/trackbacks/69106.html当我们的E序崩溃Ӟ内核有可能把该程序当前内存映到core文g里,方便E序员找到程序出现问题的地方。最常出 现的Q几乎所有CE序员都出现q的错误是“D错?#8221;?jin)。也是最难查出问题原因的一个错误。下面我们就针对“D错?#8221;来分析core文g的生、以?qing)我? 如何利用core文g扑ֈ出现崩溃的地斏V?/font>

何谓core文g

当一个程序崩溃时Q在q程当前工作目录的core文g中复制了(jin)该进E的存储囑փ?font face="Times New Roman">core文g仅仅是一个内存映?font face="Times New Roman">(同时加上调试信息)Q主要是用来调试的?/font>

当程序接收到以下UNIX信号?x)生core文gQ?/font>

名字

说明

ANSI C  POSIX.1

SVR4  4.3+BSD

~省动作

SIGABRT

异常l止(abort)

  .       .

  .      .

l止w/core

SIGBUS

g故障

          .

  .      .

l止w/core

SIGEMT

g故障

 

  .      .

l止w/core

SIGFPE

术异常

  .       .

  .      .

l止w/core

SIGILL

非法g指o(h)

  .       .

  .      .

l止w/core

SIGIOT

g故障

 

  .      .

l止w/core

SIGQUIT

l端退出符

          .

  .      .

l止w/core

SIGSEGV

无效存储讉K

  .       .

  .      .

l止w/core

SIGSYS

无效pȝ调用

 

  .      .

l止w/core

SIGTRAP

g故障

 

  .      .

l止w/core

SIGXCPU

过CPU限制(setrlimit)

 

  .      .

l止w/core

SIGXFSZ

过文g长度限制(setrlimit)

 

  .      .

l止w/core

在系l默认动作列Q?#8220;l止w/core”表示在进E当前工作目录的core文g中复制了(jin)该进E的存储囑փQ该文g名ؓ(f)coreQ由此可以看?gu)U功能很久之前就是UNIX功能的一部分Q。大多数UNIX调试E序都用core文g以检查进E在l止时的状态?/font>

core文g的生不是POSIX.1所属部?而是很多UNIX版本的实现特征。UNIXW?版没有检查条? (a)?b)Qƈ且其源代码中包含如下说明Q?#8220;如果你正在找M护信P那么当设|?用户-ID命o(h)执行Ӟ可能生大量的q种信号”?.3 + BSD产生名ؓ(f)core.prog的文Ӟ其中prog是被执行的程序名的前1 6个字W。它对core文gl予?jin)某U标识,所以是一U改q特征?/font>

表中“g故障”对应于实现定义的g故障。这些名字中有很多取自UNIX早先在DP-11上的实现。请查看你所使用的系l的手册Q以切地确定这些信号对应于哪些错误cd?/font>

下面比较详细地说明这些信受?/font>

SIGABRT 调用abort函数时生此信号。进E异常终止?/font>

SIGBUS  指示一个实现定义的g故障?/font>

SIGEMT  指示一个实现定义的g故障?/font>

EMTq一名字来自PDP-11的emulator trap 指o(h)?/font>

SIGFPE  此信可CZ个算术运异常,例如除以0QQҎ(gu)出等?/font>

SIGILL  此信hCE已执行一条非法硬件指令?/font>

4.3BSD由abort函数产生此信受SIGABRT现在被用于此?/font>

SIGIOT  q指CZ个实现定义的g故障?/font>

IOTq个名字来自于PDP-11对于输入Q输出TRAP(input/output TRAP)指o(h)的羃写。系lV的早期版本,由abort函数产生此信受SIGABRT现在被用于此?/font>

SIGQUIT 当用户在l端上按退出键Q一般采用Ctrl-\Q时Q生此信号Qƈ送至前台q?/font>

E组中的所有进E。此信号不仅l止前台q程l(如SIGINT所做的那样Q,同时产生一个core文g?/font>

SIGSEGV 指示q程q行?jin)一ơ无效的存储讉K?/font>

名字SEGV表示“D违例(segmentation violationQ?#8221;?/font>

SIGSYS  指示一个无效的pȝ调用。由于某U未知原因,q程执行?jin)一条系l调用指令,

但其指示pȝ调用cd的参数却是无效的?/font>

SIGTRAP 指示一个实现定义的g故障?/font>

此信号名来自于PDP-11的TRAP指o(h)?/font>

SIGXCPU SVR4?.3+BSD支持资源限制的概c(din)如果进E超q了(jin)其YC P U旉限制Q则产生此信受?/font>

SIGXFSZ 如果q程过?jin)其软文仉度限Ӟ则SVR4?.3+BSD产生此信受?/font>

摘自《UNIX环境高~程》第10?信号?/font>

 

使用core文g调试E序

看下面的例子Q?/font>

/*core_dump_test.c*/
 #include <stdio.h>
const char *str = "test";
void core_test(){
    str[1] = 'T';
}

int main()
{
    core_test();
    return 0;
}

~译Q?br>gcc –g core_dump_test.c -o core_dump_test

如果需要调试程序的话,使用gcc~译时加?font face="Times New Roman">-g选项Q这栯?font face="Times New Roman">core文g的时候比较容易找到错误的地方?/font>

执行Q?br> ./core_dump_test
D错?/font>

q行core_dump_testE序出现?#8220;D错?#8221;Q但没有产生core文g。这是因为系l默?font face="Times New Roman">core文g的大ؓ(f)0Q所以没有创建。可以用ulimit命o(h)查看和修?font face="Times New Roman">core文g的大?br>ulimit -c 0
ulimit -c 1000
ulimit -c 1000

-c 指定修改core文g的大,1000指定?font face="Times New Roman">core文g大小。也可以?font face="Times New Roman">core文g的大不做限Ӟ如:(x)

ulimit -c unlimited
ulimit -c unlimited

如果惌修改怹生效Q则需要修攚w|文Ӟ?font face="Times New Roman"> .bash_profile?font face="Times New Roman">/etc/profile?font face="Times New Roman">/etc/security/limits.conf?/font>

再次执行Q?br>./core_dump_test
D错?/font> (core dumped)
ls core.*
core.6133

可以看到已经创徏?jin)一?font face="Times New Roman">core.6133的文?font face="Times New Roman">.6133?font face="Times New Roman">core_dump_testE序q行的进E?font face="Times New Roman">ID?/font>

调式core文g
core文g是个二进制文Ӟ需要用相应的工h分析E序崩溃时的内存映像?/font>

file core.6133

core.6133: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style, from 'core_dump_test'

?font face="Times New Roman">Linux下可以用GDB来调?font face="Times New Roman">core文g?/font>

gdb core_dump_test core.6133

GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
Core was generated by `./core_dump_test'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0  0x080482fd in core_test () at core_dump_test.c:7
7           str[1] = 'T';
(gdb) where
#0  0x080482fd in core_test () at core_dump_test.c:7
#1  0x08048317 in main () at core_dump_test.c:12
#2  0x42015574 in __libc_start_main () from /lib/tls/libc.so.6

GDB中键?font face="Times New Roman">whereQ就?x)看到程序崩溃时堆栈信息Q当前函C前的所有已调用函数的列表(包括当前函数Q,gdb只显C最q几个)(j)Q我们很Ҏ(gu)扑ֈ我们的程序在最后崩溃的时候调用了(jin)core_dump_test.c W?font face="Times New Roman">7行的代码Q导致程序崩溃。注意:(x)在编译程序的时候要加入选项-g。?zhn)也可以试试其他命令, 如 fram?font face="Times New Roman">list{。更详细的用法,h?font face="Times New Roman">GDB文档?/font>

core文g创徏在什么位|?/strong>

在进E当前工作目录的下创建。通常与程序在相同的\径下。但如果E序中调用了(jin)chdir函数Q则有可能改变了(jin)当前? 作目录。这时core文g创徏在chdir指定的\径下。有好多E序崩溃?jin),我们却找不到core文g攑֜什么位|。和chdir函数有关系。当然程? 崩溃?jin)不一定都产生core文g?/font>

什么时候不产生core文g

在下列条件下不生core文gQ?br>( a )q程是设|?用户-IDQ而且当前用户qE序文g的所有者;
( b )q程是设|?l?IDQ而且当前用户q该程序文件的l所有者;
( c )用户没有写当前工作目录的许可权;
( d )文g太大。core文g的许可权(假定该文件在此之前ƈ不存?通常是用戯/写,l读和其他读?/font>

利用GDB调试core文gQ当遇到E序崩溃时我们不再束手无{?/font>




]]>
便利的开发编辑工?vim http://www.shnenglu.com/loky/archive/2008/12/09/68978.html。。。?/dc:creator>。。。?/author>Tue, 09 Dec 2008 13:13:00 GMThttp://www.shnenglu.com/loky/archive/2008/12/09/68978.htmlhttp://www.shnenglu.com/loky/comments/68978.htmlhttp://www.shnenglu.com/loky/archive/2008/12/09/68978.html#Feedback0http://www.shnenglu.com/loky/comments/commentRss/68978.htmlhttp://www.shnenglu.com/loky/services/trackbacks/68978.html阅读全文

]]>
用GDB调试E序(8)──查看栈信?zzhttp://www.shnenglu.com/loky/archive/2008/12/09/68977.html。。。?/dc:creator>。。。?/author>Tue, 09 Dec 2008 13:06:00 GMThttp://www.shnenglu.com/loky/archive/2008/12/09/68977.htmlhttp://www.shnenglu.com/loky/comments/68977.htmlhttp://www.shnenglu.com/loky/archive/2008/12/09/68977.html#Feedback0http://www.shnenglu.com/loky/comments/commentRss/68977.htmlhttp://www.shnenglu.com/loky/services/trackbacks/68977.html查看栈信?/h2>

当程序被停住?jin),你需要做的第一件事是查看E序是在哪里停住的。当你的E序调用?jin)一个函敎ͼ函数的地址Q函数参敎ͼ函数内的局部变量都?x)被压?#8220;?#8221;Q?/font>StackQ中。你可以?/font>GDB命o(h)来查看当前的栈中的信息?/font>

下面是一些查看函数调用栈信息?/font>GDB命o(h)Q?/font>

    BacktraceQ?/font>bt 打印当前的函数调用栈的所有信息?/font>如:(x)       
        (gdb) bt
        #0 func (n=250) at tst.c:6
        #1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
        #2 0x400409ed in __libc_start_main () from /lib/libc.so.6
       
从上可以看出函数的调用栈信息Q?/font>__libc_start_main --> main() --> func()   
    backtrace <n>
Q?bt <n> n是一个正整数Q表C只打印栈顶?/font>n层的栈信息?/font>

    backtrace <-n> Q?/font>bt <-n> -n表一个负整数Q表C只打印栈底?/font>n层的栈信息?nbsp;      
如果你要查看某一层的信息Q你需要在切换当前的栈Q一般来_(d)E序停止Ӟ最层的栈是当前栈,如果你要查看栈下面层的详l信息,首先要做的是切换当前栈?/font>

frame <n>Q?/font>f <n> n是一个从0开始的整数Q是栈中的层~号。比如:(x)frame 0Q表C栈Ӟframe 1Q表C栈的第二层?/font>
   up <n>        
表示向栈的上面移?/font>n层,可以不打nQ表C向上移动一层?/font>

down <n> 表示向栈的下面移?/font>n层,可以不打nQ表C向下移动一层?

上面的命令,都会(x)打印出移动到的栈层的信息。如果你不想让其打出信息。你可以使用q三个命令:(x)

     select-frame <n> 对应?frame 命o(h)?/font>
      up-silently <n>
对应?up 命o(h)?/font>
      down-silently <n>
对应?down 命o(h)?/font>

查看当前栈层的信息,你可以用以下GDB命o(h)Q?/font>

frame ?f       ?x)打印出q些信息Q栈的层~号Q当前的函数名,函数参数|函数所在文件及(qing)行号Q函数执行到的语句?/font>

info frameQ?/font>info f q个命o(h)?x)打印出更?f)详细的当前栈层的信息Q只不过Q大多数都是q行时的内内地址。比如:(x)函数地址Q调用函数的地址Q被调用函数的地址Q目前的函数是由什么样的程序语a写成的、函数参数地址?qing)倹{局部变量的地址{等?/font>如:(x)
           (gdb) info f
           Stack level 0, frame at 0xbffff5d4:
             eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
             called by frame at 0xbffff60c
             source language c.
             Arglist at 0xbffff5d4, args: n=250
             Locals at 0xbffff5d4, Previous frame's sp is 0x0
             Saved registers:
             ebp at 0xbffff5d4, eip at 0xbffff5d8
             
     info args     
打印出当前函数的参数名及(qing)其倹{?nbsp;   
     info locals    
打印出当前函C所有局部变量及(qing)其倹{?nbsp;      
     info catch     
打印出当前的函数中的异常处理信息?/font>

]]>
һþaþþƷ| þùֻоƷ| Ʒþþþù| AAAþþþƷƬ| ˾þ| 2021ھƷþþþþӰԺ| ŷ龫Ʒþþþþþþžž | Ưޱ˾þþƷ| þùɫavѿ| ƷþþþþþþþӰԺ| þþþþùaѹۿɫƬ| Ʒþþþþþþ | 99þۺϺݺۺϾþ| þúݺɫۺ| ũ帾ŮëƬƷþ| þAV뾫Ʒ| Ұ¾þһ| þþþ뾫Ʒ| þþþһ| þùƵ99Ӱ| þþþþþþþþþƷ| ŷvaþþþ| ˾Ʒþһav | þþþƷ鶹| þþþþþ99Ʒѹۿ| þþƷɫ鶹| ޾ƷҾþþþþ| ŷۺҹҹþ| պvavaŷvaþ| ҹҹݺݾþAV| Ʒ99þþþþè| ݺɫþþۺ| þٸ۲AVר| Ʒ˾þþþҹӰ| þþþþۺ| 91þۺ| þþþëƬ | þþþþŹƷ| ƷѾþþþþþ| þþƷav鶹ѿ| Ʒ99þþƷ|