新聞中心
在Linux系統(tǒng)中,Debug文件是一種十分重要的文件類型,它包含了程序運(yùn)行時(shí)的調(diào)試信息,可以幫助程序員分析、定位程序的錯(cuò)誤。在調(diào)試過程中,Debug文件是必不可少的,因?yàn)樗軌蛱峁┏绦蛟谶\(yùn)行時(shí)的程序計(jì)數(shù)器、棧跟蹤、函數(shù)參數(shù)、變量、源代碼等信息,從而幫助程序員找到問題的具體所在。本文將詳細(xì)介紹Linux Debug文件的相關(guān)知識和使用方法。

公司主營業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出興平免費(fèi)做網(wǎng)站回饋大家。
一、產(chǎn)生Debug文件的方式
在Linux系統(tǒng)中,Debug文件是通過編譯器和鏈接器來生成的。編譯器的作用是將源代碼轉(zhuǎn)化為機(jī)器代碼,而鏈接器則將編譯器生成的目標(biāo)文件、庫文件等鏈接在一起,形成可執(zhí)行文件。Debug文件的生成是編譯器和鏈接器在編譯和鏈接過程中的一部分工作,它們會(huì)將代碼中一些符號的地址信息等調(diào)試信息存儲(chǔ)在Debug文件中。
編譯器和鏈接器都支持生成Debug文件的選項(xiàng),具體方法如下:
1.使用GCC編譯器
在使用GCC編譯器時(shí),使用-g選項(xiàng)可以指定生成Debug文件,例如:
“`
gcc -g test.c -o test
“`
這條命令會(huì)將test.c文件編譯成目標(biāo)文件test.o,然后將test.o鏈接成可執(zhí)行文件test,并在該過程中生成Debug文件test.debug。
2.使用GDB調(diào)試器
GDB是Linux系統(tǒng)中更流行的調(diào)試器之一,它可以使用以下命令生成Debug文件:
“`
gdb -batch -ex ‘compile -g test.c’ -ex ‘quit’
“`
這條命令會(huì)將test.c編譯成目標(biāo)文件test.o,并在該過程中生成Debug文件test.debug,但不會(huì)鏈接生成可執(zhí)行文件。
二、Debug文件的格式
在Linux系統(tǒng)中,Debug文件有多種格式,包括ELF格式、DWARF格式、STABS格式等。其中,DWARF(Debugging With Attributed Record Formats)格式是Linux系統(tǒng)中最常用的Debug文件格式,支持多種調(diào)試信息,包括源代碼信息、變量信息、函數(shù)調(diào)用關(guān)系、類型信息等。DWARF格式的Debug文件通常以.dwo或.debug文件名后綴結(jié)尾。
三、Debug文件的使用
Debug文件主要用于程序調(diào)試,通過Debug文件可以獲取程序運(yùn)行時(shí)的相關(guān)信息,如變量值、函數(shù)調(diào)用關(guān)系、棧跟蹤、源代碼等。以下列舉幾個(gè)使用Debug文件調(diào)試程序的方法:
1.使用GDB調(diào)試器
GDB是Linux系統(tǒng)中最常用的調(diào)試器,可以通過以下命令將Debug文件加載到GDB中:
“`
gdb test
(gdb) symbol-file test.debug
“`
這樣就將Debug文件加載到了GDB中,在調(diào)試過程中可以查看各種調(diào)試信息。
2.使用Eclipse IDE
Eclipse是一款強(qiáng)大的開發(fā)工具,它集成了各種開發(fā)工具,包括調(diào)試工具??梢酝ㄟ^以下步驟使用Debug文件來調(diào)試程序:
(1)在Eclipse中打開程序項(xiàng)目;
(2)通過“Debug Configurations”菜單進(jìn)入調(diào)試設(shè)置界面;
(3)在“C/C++ Application”窗口中選擇要調(diào)試的程序;
(4)在“Debugger”選項(xiàng)卡中選擇GDB調(diào)試器;
(5)在“Debugger”選項(xiàng)卡中設(shè)置Debug文件路徑。
這樣就可以在Eclipse IDE中使用Debug文件來調(diào)試程序了。
3.使用Valgrind工具
Valgrind是一款程序分析和調(diào)試工具,它可以檢查程序中的內(nèi)存泄漏、越界訪問等問題,使用非常方便??梢酝ㄟ^以下步驟使用Debug文件來調(diào)試程序:
(1)用-g選項(xiàng)重新編譯程序文件;
(2)使用valgrind命令行工具啟動(dòng)程序;
(3)在valgrind中執(zhí)行需要調(diào)試的程序。
四、Debug文件的注意點(diǎn)
在使用Debug文件調(diào)試程序時(shí),需要注意以下幾點(diǎn):
1.要保證Debug文件所在路徑和程序文件所在路徑相同,否則GDB等調(diào)試器可能無法找到Debug文件。
2.要注意Debug文件的大小,Debug文件通常比較大,可能會(huì)占用較多磁盤空間,需要及時(shí)清理。
3.要保證Debug文件的安全性,Debug文件中包含了程序運(yùn)行時(shí)的重要信息,可能會(huì)被黑客利用,需要妥善保管。
Debug文件是程序調(diào)試中不可或缺的一環(huán),它提供了程序在運(yùn)行時(shí)的各種調(diào)試信息,能夠幫助程序員找到程序的錯(cuò)誤所在。本文介紹了Debug文件的產(chǎn)生方式、格式、使用方法和注意點(diǎn),希望能夠幫助讀者更好地理解和使用Debug文件。
相關(guān)問題拓展閱讀:
- 幾個(gè)常用的linux性能監(jiān)控命令
- u hub的linux驅(qū)動(dòng)問題求教,多謝
幾個(gè)常用的linux性能監(jiān)控命令
1. sar
每兩秒刷新一次, 總共5次
# sar 2 5
Linux 2.6.32-504.el6.x86_64 (dbhost01) 03/30/2023 _x86_64_ (4 CPU)
02:53:15 PM CPU %user %nice %system %iowait %steal %idle
02:53:17 PM all……96
02:53:19 PM all……51
02:53:21 PM all……17
02:53:23 PM all……80
02:53:25 PM all……70
Average:all……23
2. top
top -a 按照拿畝碼內(nèi)耐瞎存降消哪序
# top -a
top – 15:00:54 up 6:04, 1 user, load average: 0.31, 0.19, 0.11
Tasks: 306 total, 1 running, 305 sleeping, 0 stopped, 0 zombie
Cpu(s): 7.8%us, 2.4%sy, 0.0%ni, 88.9%id, 0.8%wa, 0.0%hi, 0.1%si, 0.0%st
Mem:k total,k used,k free,k buffers
Swap:k total,k used,k free,k cached
3. vmstat
vmstat用于顯示虛擬內(nèi)存,內(nèi)核線程,磁盤,系統(tǒng)進(jìn)程, CPU活動(dòng)等統(tǒng)計(jì)信息。
需要安裝sysstat工具。
# vmstat
procemoryswapiosystemcpu—–
r b swpd free buff cache si so bi bo in cs us sy id wa st
#
# vmstat 2 5
procemoryswapiosystemcpu—–
r b swpd free buff cache si so bi bo in cs us sy id wa st
4. lsof(list open files)
# lsof | grep 1521
certmongeroot 16r FIFO 0,tpipe
certmongeroot 18r FIFO 0,tpipe
gipcd.bingrid 109u unix 0xffff 0tsocket
5. tcpdump
tcpdump -i eth1
15:24:28.IP dbhost01.ssh > 192.168.2.82.50990: Flags
, seq:393596, ack 105, win 148, options , length 516
15:24:28.IP dbhost01.ssh > 192.168.2.82.50990: Flags
, seq:393596, ack 105, win 148, options , length 516
15:24:28.IP dbhost01.ssh > 192.168.2.82.50990: Flags
, seq:393968, ack 105, win 148, options , length 372
15:24:28.IP dbhost01.ssh > 192.168.2.82.50990: Flags
, seq:393968, ack 105, win 148, options , length 372
15:24:28.IP 192.168.2.82.50990 > dbhost01.ssh: Flags , ack, win 16652, options , length 0
15:24:28.IP dbhost02-priv.23602 > dbhost01-priv.24271: UDP, length 556
15:24:28.IP dbhost01-priv.24271 > dbhost02-priv.23602: UDP, length 80
15:24:28.IP dbhost01-priv.24271 > dbhost02-priv.23602: UDP, length 80
15:24:28.IP dbhost01.ssh > 192.168.2.82.50990: Flags
, seq:394724, ack 105, win 148, options , length 756
15:24:28.IP dbhost01.ssh > 192.168.2.82.50990: Flags
, seq:394724, ack 105, win 148, options , length 756
15:24:28.IP dbhost01-priv.24271 > dbhost02-priv.23602: UDP, length 556
15:24:28.IP dbhost01.ssh > 192.168.2.82.50990: Flags
, seq:395176, ack 105, win 148, options , length 452
15:24:28.IP dbhost01.ssh > 192.168.2.82.50990: Flags
, seq:395176, ack 105, win 148, options , length 452
6.netstat
# netstat -a | grep oracle
unix STREAM LISTENING/var/tmp/.oracle/ora_gipc_sdbhost01gridmyracdb-clusterCRFM_SIPC
unix STREAM LISTENING/var/tmp/.oracle/sdbhost01DBG_LOGD
unix STREAM LISTENING/var/tmp/.oracle/sdbhost01DBG_EVMD
unix STREAM LISTENING/var/tmp/.oracle/sAevm
unix STREAM LISTENING/var/tmp/.oracle/sSYSTEM.evm.acceptor.auth
7. htop
需要安裝
8. iostat
Total DISK READ: 91.48 K/s | Total DISK WRITE: 45.27 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
4071 be/4 oracle.18 K/s 0.00 B/s 0.00 % 4.69 % ora_lmon_orcl1
4117 be/4 oracle.36 K/s 15.09 K/s 0.00 % 3.69 % ora_ckpt_orcl1
2989 rt/4 grid.71 B/s 0.00 B/s 0.00 % 2.13 % ocssd.bin
4099 be/4 oracle.00 B/s 30.18 K/s 0.00 % 0.07 % ora_ckpt_test
2987 rt/4 grid.00 B/s 482.86 B/s 0.00 % 0.03 % ocssd.bin
2979 rt/3 root.00 B/s 3.77 K/s 0.00 % 0.00 % ologgerd -M -d /g01/grid/app/11.2.0/grid/crf/db/dbhost01
2980 rt/3 root.00 B/s 15.09 K/s 0.00 % 0.00 % ologgerd -M -d /g01/grid/app/11.2.0/grid/crf/db/dbhost01
u hub的linux驅(qū)動(dòng)問題求教,多謝
static int __init ohci_hcd_mod_init(void)
{
platform_driver_register(&ohci_hcd_s3c2410_driver);
}
其實(shí)真正注冊的是ohci_hcd_s3c2410_driver這個(gè)驅(qū)動(dòng)。那我們來看一下這個(gè)結(jié)構(gòu)體的具體值。
static struct platform_driver ohci_hcd_s3c2410_driver= {
.probe = ohci_hcd_s3c2410_drv_probe,
.remove = ohci_hcd_s3c2410_drv_remove,
.shutdown = u_hcd_platform_shutdown,
.driver = {
.owner = THIS_MODULE,
.name = “s3c2410-ohci”,
},
};
那我們一一來看上述的每一個(gè)函清知數(shù)的實(shí)現(xiàn)。
2.1 hcd 探測
函數(shù)很簡單其實(shí)現(xiàn)功能的是u_hcd_s3c2410_probe函數(shù)。
static int ohci_hcd_s3c2410_drv_probe(structplatform_device *pdev)
{
returnu_hcd_s3c2410_probe(&ohci_s3c2410_hc_driver, pdev);
}
ohci_s3c2410_hc_driver提供了對于ohci的操作集。對于這些函數(shù)在后面的學(xué)習(xí)中去看,在此不加擴(kuò)展。我們將下面的函數(shù)剔除枝葉留其主干。
static int u_hcd_s3c2410_probe (const structhc_driver *driver,
struct platform_device *dev)
{
structu_hcd *hcd = NULL;
int retval;
#if !defined(CONFIG_ARCH_2410)
u_host_clk_en();使能clk
#endif
s3c2410_u_set_power(dev->dev.platform_data,1, 1);
s3c2410_u_set_power(dev->dev.platform_data,2, 1);
hcd =u_create_hcd(driver, &dev->dev, “s3c24xx”); –創(chuàng)建一個(gè)hcd
hcd->rsrc_start= dev->resource.start; –獲取物理地址
hcd->rsrc_len = dev->resource.end -dev->resource.start + 1;
request_mem_region(hcd->rsrc_start,hcd->rsrc_len, hcd_name);
clk =clk_get(&dev->dev, “u-host”);
s3c2410_start_hc(dev,hcd);
hcd->regs= ioremap(hcd->rsrc_start, hcd->rsrc_len);
ohci_hcd_init(hcd_to_ohci(hcd));
retval = u_add_hcd(hcd,dev->resource.start, IRQF_DISABLED);
return 0;
}
對于u的電源管理,我們暫時(shí)不看,不看不代表不重要,電源管理是很重枯仔要的。
那依次來看上面的函數(shù)。答敗消u_create_hcd創(chuàng)建和初始化一個(gè)hcd結(jié)構(gòu)體。
s3c2410_start_hc啟動(dòng)hc。這里有一個(gè)很奇怪的結(jié)構(gòu)體就是struct s3c2410_hcd_info,在s3c6410中并沒有看到該結(jié)構(gòu)體的賦值。也許有人對此很困惑,該結(jié)構(gòu)體做什么用的。那我們來看該結(jié)構(gòu)體的真正面目。
struct s3c2410_hcd_info {
structu_hcd *hcd; –保存該hcd_info所屬的hcd
structs3c2410_hcd_portport; –兩個(gè)端口。
void(*power_control)(intport, int to); –電源控制
void(*enable_oc)(structs3c2410_hcd_info *, int on);
void(*report_oc)(structs3c2410_hcd_info *, int ports);
};
在u-host.txt中對其功能進(jìn)行了說明,就是一對函數(shù),使能過流檢測和控制端口電源狀態(tài)。
power_control:使能或禁止端口電源
enable_oc :使能或禁止端口過流檢測
report_oc :當(dāng)端口存在過流,則會(huì)調(diào)用該函數(shù)。
static void s3c2410_start_hc(structplatform_device *dev, struct u_hcd *hcd)
{
structs3c2410_hcd_info *info = dev->dev.platform_data;
clk_enable(clk);
if (info !=NULL) { –在s3c6410中該info為空。
info->hcd = hcd;
info->report_oc= s3c2410_hcd_oc;
if(info->enable_oc != NULL) {
(info->enable_oc)(info,1);
}
}
}
初始化ohci_hcd
static void ohci_hcd_init(structohci_hcd *ohci)
{
ohci->next_statechange= jiffies;
spin_lock_init(&ohci->lock);
INIT_LIST_HEAD(&ohci->pending);
}
初始化并注冊u_hcd
完成通用hcd的初始化和注冊,在這里同時(shí)完成中斷的申請和注冊。
int u_add_hcd(struct u_hcd *hcd,unsigned intirqnum, unsigned long irqflags)
{
int retval;
structu_device *rhdev;
hcd->authorized_default= hcd->wireless? 0 : 1; –判斷是否為無線
set_bit(HCD_FLAG_HW_ACCESSIBLE,&hcd->flags); –設(shè)置HW_ACCESSIBLE旗標(biāo)
if ((retval =hcd_buffer_create(hcd)) != 0) { –開辟hcd的緩沖區(qū)
returnretval;
}
if ((retval =u_register_bus(&hcd->self)) self, 0)) == NULL) {
retval= -ENOMEM;
gotoerr_allocate_root_hub;
}
rhdev->speed= (hcd->driver->flags & HCD_USB2) ? USB_SPEED_HIGH :USB_SPEED_FULL;–指定根hub的speed
hcd->self.root_hub= rhdev;
device_init_wakeup(&rhdev->dev,1);
if(hcd->driver->reset && (retval = hcd->driver->reset(hcd))self.controller)
&&device_can_wakeup(&hcd->self.root_hub->dev))
dev_dbg(hcd->self.controller,”supports USB remote wakeup\n”);
if(hcd->driver->irq) { –中斷處理
if(irqflags & IRQF_SHARED)
irqflags&= ~IRQF_DISABLED;
snprintf(hcd->irq_descr,sizeof(hcd->irq_descr), “%s:u%d”,
hcd->driver->description,hcd->self.busnum);
request_irq(irqnum,&u_hcd_irq, irqflags,hcd->irq_descr, hcd);–申請中斷線
}
hcd->irq= irqnum;
} else {
hcd->irq= -1;
}
hcd->driver->start(hcd); –調(diào)用start為 ohci_s3c2410_start
rhdev->bus_mA= min(500u, hcd->power_budget);
register_root_hub(hcd)); –注冊root hub
retval =sysfs_create_group(&rhdev->dev.kobj, &u_bus_attr_group);
if (retvaluses_new_polling && hcd->poll_rh)
u_hcd_poll_rh_status(hcd);
returnretval;
}
那一一來看上面的函數(shù),學(xué)習(xí)內(nèi)核就要有打破砂鍋問到底的精神,唯有知道那背后的種種風(fēng)光,才能領(lǐng)略那種種風(fēng)采。閑話不說,繼續(xù)!
記住下面結(jié)構(gòu)體中flag的值。那就看這幾個(gè)宏定義是什么意思。
#defineHCD_MEMORY 0x-hc的寄存器使用memory映射
#defineHCD_LOCAL_MEM 0xhc使用local memory
#defineHCD_USB11 0xu1.1
#defineHCD_USB2 0xu2.0
static const struct hc_driver ohci_s3c2410_hc_driver=
{
.flags =HCD_USB11 | HCD_MEMORY,
};
為hcd分配緩沖池,當(dāng)hc需要使用DMA內(nèi)存分配器。
int hcd_buffer_create(struct u_hcd *hcd)
{
charname;
inti, size;
if(!hcd->self.controller->dma_mask &&
!(hcd->driver->flags &HCD_LOCAL_MEM))
return 0;
–#define HCD_BUFFER_POOLS 4
我們查看pool_max其實(shí)是一個(gè)全局?jǐn)?shù)組。如果需要開辟的緩沖區(qū)更大的話,直接采用分配page的函數(shù)。
static const size_tpool_max = {
32,128,512,PAGE_SIZE/ 2
};
for (i = 0; ipool = dma_pool_create(name,hcd->self.controller,size, size, 0);
if(!hcd->pool ) {
hcd_buffer_destroy(hcd);
return-ENOMEM;
}
}
return 0;
}
dma_pool_create創(chuàng)建一個(gè)DMA池(生成一個(gè)dma_pool,并沒有分配相應(yīng)空間,真正分配物理內(nèi)存將在dma_pool_alloc()總實(shí)現(xiàn))。
下面的函數(shù)是u_bus注冊,對于該函數(shù)也許很難理解。不過參照網(wǎng)上
的說明,估計(jì)會(huì)好理解很多。
每個(gè)主機(jī)控制器擁有一個(gè)USB系統(tǒng),稱為一個(gè)USB總線。USBD支持多個(gè)主機(jī)控制器,即多個(gè)USB總線。當(dāng)每增加一個(gè)主機(jī)控制器時(shí),會(huì)給他分配一個(gè)u_bus結(jié)構(gòu)。USBD動(dòng)態(tài)安裝和卸載主機(jī)驅(qū)動(dòng)。主機(jī)驅(qū)動(dòng)安裝時(shí),他的初始化函數(shù)一方面完成主機(jī)控制器硬件的設(shè)置和初始化工作,另一方面調(diào)用u_alloc_bus和u_register_bus來將自己注冊到USBD中去,供USB子系統(tǒng)訪問。
static int u_register_bus(struct u_bus *bus)
{
int result =-E2BIG;
int busnum;
mutex_lock(&u_bus_list_lock);
busnum =find_next_zero_bit (buap.buap, USB_MAXBUS, 1);
–用buap來存儲(chǔ)主機(jī)驅(qū)動(dòng),一個(gè)bit位代表一個(gè)主機(jī)驅(qū)動(dòng)
if (busnum >=USB_MAXBUS) {
return result;
}
set_bit (busnum,buap.buap);
bus->busnum = busnum;
bus->dev =device_create(u_host_class, bus->controller, MKDEV(0, 0),bus,”u_host%d”, busnum);
–在u_host類下創(chuàng)建一個(gè)u_host設(shè)備。
list_add(&bus->bus_list, &u_bus_list);
mutex_unlock(&u_bus_list_lock);
u_notify_add_bus(bus);
return 0;
linux dbg文件的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux dbg文件,Linux Debug文件詳解,幾個(gè)常用的linux性能監(jiān)控命令,u hub的linux驅(qū)動(dòng)問題求教,多謝的信息別忘了在本站進(jìn)行查找喔。
成都創(chuàng)新互聯(lián)建站主營:成都網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、網(wǎng)站改版的網(wǎng)站建設(shè)公司,提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、成都網(wǎng)站推廣、成都網(wǎng)站優(yōu)化seo、響應(yīng)式移動(dòng)網(wǎng)站開發(fā)制作等網(wǎng)站服務(wù)。
新聞標(biāo)題:LinuxDebug文件詳解(linuxdbg文件)
分享URL:http://fisionsoft.com.cn/article/coepijg.html


咨詢
建站咨詢
