A. Binutils是什么
目前(2009.9)最新版本为:Binutils (2.19):
ftp://ftp.gnu.org/gnu/binutils/Binutils的内容
Binutils 是一组开发工具,包括连接器,汇编器和其他用于目标文件和档案的工具。安装下列程序: addr2line, ar, as, c++filt, gprof, ld, nm, obj, objmp, ranlib, readelf, size, strings 和 strip安装下列库文件: libiberty.a, libbfd.[a,so] 和 libopcodes.[a,so] 简短说明
addr2line 把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。ar 建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。as 主要用来编译GNU C编译器gcc输出的汇编文件,产生的目标文件由连接器ld连接。c++filt 连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。gprof 显示程序调用段的各种数据。ld 是连接器,它把一些目标和归档文件结合在一起,重定位数据,并链接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。nm 列出目标文件中的符号。obj把一种目标文件中的内容复制到另一种类型的目标文件中.objmp 显示一个或者更多目标文件的信息。显示一个或者更多目标文件的信息。使用选项来控制其显示的信息。它所显示的信息通常只有编写编译工具的人才感兴趣。ranlib 产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。readelf 显示ebf格式可执行文件的信息。size 列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。strings 打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项-n设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印字符,这个程序对于了解非文本文件的内容很有帮助。
B. linux中使用grep命令搜索文件名及文件内容的方法
从文件中搜索并显示文件名
当你从不止一个的文件中搜索时,默认它将显示文件名:
代码如下:
grep
word
文件名
grep
root
/etc/*
示例输出:
代码如下:
/etc/bash.bashrc:
See
man
sudo_root
for
details.
/etc/crontab:17
*
*
*
*
root
cd
/
run-parts
--report
/etc/cron.hourly
/etc/crontab:25
6
*
*
*
root
test
-x
/usr/sbin/anacron
||
(
cd
/
run-parts
--report
/etc/cron.daily
)
/etc/crontab:47
6
*
*
7
root
test
-x
/usr/sbin/anacron
||
(
cd
/
run-parts
--report
/etc/cron.weekly
)
/etc/group:root:x:0:
grep:
/etc/gshadow:
Permission
denied
/etc/logrotate.conf:
create
0664
root
utmp
/etc/logrotate.conf:
create
0660
root
utmp
每行开始的第一个部分是文件名(如:/etc/crontab、/etc/group)。使用
-l
选项可以只显示文件名:
代码如下:
grep
-l
string
filename
grep
-l
root
/etc/*
示例输出:
代码如下:
/etc/aliases
/etc/arpwatch.conf
grep:
/etc/at.deny:
Permission
denied
/etc/bash.bashrc
/etc/bash_completion
/etc/ca-certificates.conf
/etc/crontab
/etc/group
你也可以逆转输出;使用
-L
选项来输出那些不匹配的文件的文件名:
代码如下:
grep
-L
word
filename
grep
-L
root
/etc/*
示例输出:
代码如下:
/etc/apm
/etc/apparmor
/etc/apparmor.d
/etc/apport
/etc/apt
/etc/avahi
/etc/bash_completion.d
/etc/bindresvport.blacklist
/etc/blkid.conf
/etc/bluetooth
/etc/bogofilter.cf
/etc/bonobo-activation
/etc/brlapi.key
根据文件内容查找文件
输入以下命令:
代码如下:
grep
'string'
*.txt
grep
'main('
*.c
grep
'#include'
*.c
grep
'getChar*'
*.c
grep
-i
'ultra'
*.conf
grep
-iR
'ultra'
*.conf
其中
-i
:
忽略模式(匹配字符串
valid、
VALID、
ValID
)和输入文件(匹配
file.c
FILE.c
FILE.C)的大小写。
-R
:
递归读取每个目录下的所有文件。
高亮匹配到的模式
在搜索大量文件的时候你可以轻松地高亮模式:
代码如下:
$
grep
--color=auto
-iR
'getChar();'
*.c
为查找到的模式显示文件名和行号
你也许需要显示文件名和行号:
代码如下:
$
grep
--color=auto
-iRnH
'getChar();'
*.c
其中,
-n
:
在输出的每行前面添加以
1
开始的行号。
-H
:
为每个匹配打印文件名。要搜索多个文件时这是默认选项。(LCTT
译注:-h
选项强制隐藏文件名;另外
-l
和
-L
选项用于仅显示匹配/不匹配的文件名,而
-H
和
-h用于控制在显示匹配行前显示/不显示文件名,注意区分。)
代码如下:
$grep
--color=auto
-nH
'DIR'
*
输出样例:
你也可以使用
find
命令:
代码如下:
$
find
.
-name
*.c
-print
|
xargs
grep
main(
C. 请问linux下,gcc编译程序的过程(从读取源文件到制作可执行程序中间所有过程,越详细越好)
gcc -S *.c 预处理+反汇编
D. C中_FILE_和_LINE_怎么用
这是编译器内置宏,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息。例如:
printf("FILE: %d, LINE: %d, %s/n", "__FILE__, __LINE__, "这里写上相关信息");
ANSI C标准中几个标准预定义宏:
__LINE__:在源代码中插入当前源代码行号;
__FILE__:在源文件中插入当前源文件名;
__DATE__:在源文件中插入当前的编译日期
__TIME__:在源文件中插入当前编译时间;
__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
__cplusplus:当编写C++程序时该标识符被定义。
E. 如何在flex中获取当前文档的名字和所执行的函数所在的行号
具我所知是不能的,你编译以后文件就不是你当前命名的*.MXML了,所以文档名不能获得,具我所知也没有这样的函数方法。不过如果你只是在FLEX BUILDER中,抬头看最上边的菜单栏就看到了。
函数所在的行号也应该不可通过方法获得,你如果是调试可以双击行号左边的地方添加断点,然后用DEBUG运行就可以停在那地方。
F. 如何在Java中获取当前代码行行号和文件名
如果你用的是Eclipse或MyEclipse,在代码的左边(就是有加号或减号,用于缩放代码的位置)点右键将ShowLineNumbers打上对勾就可以看见行号了,文件名看包。
G. c语言如何打印出当前源文件的文件名以及源文件的当前行号
需要准备的材料分别有:电脑、C语言编译器。
1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp。
H. Swift 如何获取当前代码的函数名和行号
#file 用于获取当前文件文件名
#line 用于获取当前行号
#column 用于获取当前列编号
#function 用于获取当前函数名
写一个调试输出日志的方法:
工具类StringFormatterUtils
I. gcc中如何定位文件名和行号的,比如__FILE__和__LINE__的内容存在什么地方,如何能够直接获取。
__FILE__ 和 __LINE__ 这两个“特定”宏,会被编译器在 “预处理” (prepreocessing) 这一步,由编译器替换成对应的文件名和行号。
用户自己定义的宏,比如
#define NUMBER 25
也是在这一步进行替换的。
具体,你可以用 gcc -E file.c 来查看,你会发现在这一步,各种宏都会被替换成实际的内容。
J. python中怎么打印行号和文件名
通过调用堆栈里面的代码对象来获取。
一般是自己引发一个异常,然后捕获这个异常,在异常处理中通过堆栈信息获得行号。
比如:
try:
raiseZeroDivisionError
exceptZeroDivisionError:
frame=sys.exc_info()[2].tb_frame.f_back
returnframe.f_lineno
如果需要更多的信息,可以通过inspect模块的stack()方法获得整个调用栈。可自定义一个exception类型。
importinspect
classMyErrorCode(object):
STANDARD=0x0001
code_map_msg={
MyErrorCode.STANDARD:"standarderror",
}
classMyError(Exception):
def__init__(self,error_code):
self.error_code=error_code
try:
_current_call=inspect.stack()[1]
_iframe=_current_call[0]
self.line_no=_iframe.f_lineno
self.mole_name=_iframe.f_globals.get("__name__","")
self.method_name=_current_call[3]
self.class_name=_iframe.f_locals.get("self",None).__class__.__name__
except(IndexError,AttributeError):
self.line_no=""
self.mole_name=""
self.method_name=""
self.class_name=""
def__repr__(self):
msg=code_map_msg.get(self.error_code,"")
return"[*]MyError:%s>%s.mole:%s,class:%s,method:%s,line:%s"%(self.error_code,msg,self.mole_name,self.class_name,self.method_name,self.line_no)
def__str__(self):
returncode_map_msg.get(self.error_code,"notfindanymatchmsgforcode:%s"%self.error_code)
然后在需要获取行号的地方引发这个异常并捕获它,然后从异常对象中获取line_no.