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.