日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux下動態(tài)庫接口測試簡易指南 (linux測試動態(tài)庫接口)

動態(tài)庫是在程序運(yùn)行時才被載入的,可以大大減小程序體積,提高程序運(yùn)行速度的鏈接庫。在Linux下,我們可以使用一些工具來測試動態(tài)庫接口,以確保其正確性和可靠性。本文將介紹一些常用的Linux下動態(tài)庫接口測試工具和測試方法,并提供一些簡易指南,幫助初學(xué)者更好地進(jìn)行動態(tài)庫接口測試。

鹽湖ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

一、動態(tài)庫接口測試概述

動態(tài)庫接口測試是測試動態(tài)庫是否能夠正確地鏈接和使用,以及是否具有預(yù)期的功能和行為。動態(tài)庫接口包括函數(shù)名、參數(shù)類型、返回類型等,它們必須與其他應(yīng)用程序或庫的接口嚴(yán)格匹配,否則就會出現(xiàn)鏈接錯誤或運(yùn)行時錯誤。

動態(tài)庫接口測試的目的是驗證應(yīng)用程序或庫能夠成功地調(diào)用動態(tài)庫的接口,并且處理不同的輸入和異常情況時能夠正確地響應(yīng)。測試用例應(yīng)涵蓋所有的接口函數(shù)和參數(shù)類型,并包括相關(guān)的邊界條件和異常情況。

二、常用的動態(tài)庫接口測試工具

1. ldd

ldd命令用來列出一個動態(tài)庫所依賴的其他庫,可以用來檢查動態(tài)庫的依賴關(guān)系和版本信息,以保證程序能夠正確鏈接并運(yùn)行。

例如:

“`

$ ldd libtest.so

libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fd40a29d000)

libm.so.6 => /lib64/libm.so.6 (0x00007fd409f2f000)

libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fd409d17000)

libc.so.6 => /lib64/libc.so.6 (0x00007fd40994e000)

/lib64/ld-linux-x86-64.so.2 (0x00007fd40a6bb000)

“`

2. nm

nm命令用來顯示動態(tài)庫中包含的符號列表,包括函數(shù)名、變量名和其他符號等,可以用來檢查動態(tài)庫中的接口是否正確定義和實現(xiàn)。

例如:

“`

$ nm libtest.so

U _ZNSt7__cxx1112basic_stringIcSt11char_trtsIcESaIcEEC1Ev

00000000000010e0 T func1

0000000000001140 T func2

U puts@@GLIBC_2.2.5

U strlen@@GLIBC_2.2.5

U std::__cxx11::basic_string, std::allocator >::size() const

“`

3. objdump

objdump命令用于查看二進(jìn)制文件的指令、符號、重定向表和其他信息。可以用objdump命令來檢查動態(tài)庫的接口是否正確實現(xiàn)、是否存在潛在的安全漏洞等。

例如:

“`

$ objdump -T libtest.so

libtest.so: file format elf64-x86-64

DYNAMIC SYMBOL TABLE:

0000000000000000 D *UND* 0000000000000000 GLIBC_2.2.5 puts

0000000000000000 D *UND* 0000000000000000 GLIBC_2.2.5 strlen

0000000000000000 w D *UND* 0000000000000000 __gmon_start__

0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __libc_start_mn

0000000000001020 g DF .text 0000000000000020 Base func1

0000000000001080 g DF .text 0000000000000020 Base func2

0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __cxa_finalize

“`

4. gdb

gdb是GNU調(diào)試器,可以用來調(diào)試動態(tài)庫中的函數(shù),查找并修復(fù)相關(guān)的錯誤和故障。

例如:

“`

$ gdb ./test

(gdb) b func1

(gdb) r

(gdb) step

(gdb) p ret

$1 = 10

(gdb) step

(gdb) p ret

$2 = 20

(gdb) q

“`

五、動態(tài)庫接口測試方法

動態(tài)庫接口測試方法包括手動測試和自動測試兩種。手動測試是通過手工執(zhí)行測試用例來檢查動態(tài)庫接口的正確性和可靠性;而自動測試則是通過一些工具來自動化執(zhí)行測試用例和檢查測試結(jié)果。

1. 手動測試

手動測試需要編寫測試用例并對其進(jìn)行手工執(zhí)行,以模擬不同的輸入和異常情況,并檢查測試結(jié)果是否與預(yù)期相符。

例如:

測試用例1:測試func1函數(shù)的功能和正確性

“`

#include

#include “l(fā)ibtest.h”

int mn() {

int ret1, ret2, expect1, expect2;

ret1 = func1(2, 3);

expect1 = 5;

if (ret1 != expect1) {

printf(“func1 test fled: expect %d, but got %d\n”, expect1, ret1);

}

ret2 = func1(-2, 3);

expect2 = 1;

if (ret2 != expect2) {

printf(“func1 test fled: expect %d, but got %d\n”, expect2, ret2);

}

return 0;

}

“`

測試用例2:測試func2函數(shù)的功能和正確性

“`

#include

#include “l(fā)ibtest.h”

int mn() {

const char* str = “hello”;

int ret1, ret2, expect1, expect2;

ret1 = func2(str);

expect1 = 5;

if (ret1 != expect1) {

printf(“func2 test fled: expect %d, but got %d\n”, expect1, ret1);

}

ret2 = func2(NULL);

expect2 = -1;

if (ret2 != expect2) {

printf(“func2 test fled: expect %d, but got %d\n”, expect2, ret2);

}

return 0;

}

“`

2. 自動測試

自動測試需要使用一些測試框架來自動化執(zhí)行測試用例和檢查測試結(jié)果。常用的測試框架包括Google Test、CUnit等。

例如:

使用Google Test測試框架進(jìn)行自動測試

“`

#include

#include “l(fā)ibtest.h”

TEST(Func1Test, PositiveTest) {

EXPECT_EQ(5, func1(2, 3));

}

TEST(Func1Test, NegativeTest) {

EXPECT_EQ(1, func1(-2, 3));

}

TEST(Func2Test, PositiveTest) {

const char* str = “hello”;

EXPECT_EQ(5, func2(str));

}

TEST(Func2Test, NegativeTest) {

EXPECT_EQ(-1, func2(NULL));

}

int mn(int argc, char **argv) {

testing::InitGoogleTest(&argc, argv);

return RUN_ALL_TESTS();

}

“`

六、

動態(tài)庫接口測試是確保動態(tài)庫正確性和可靠性的重要步驟。在Linux下,我們可以使用一些工具來測試動態(tài)庫接口,包括ldd、nm、objdump和gdb等。同時,手動測試和自動測試也是動態(tài)庫接口測試的兩種常用方法,可以根據(jù)不同的需求選擇適合自己的測試方法。

相關(guān)問題拓展閱讀:

  • 請教關(guān)于android linux動態(tài)庫.so的加載調(diào)用
  • 如何判斷l(xiāng)inux 動態(tài)庫調(diào)用

請教關(guān)于android linux動態(tài)庫.so的加載調(diào)用

1、 .so動態(tài)庫的生成

可使用gcc或者g++編譯器生成動態(tài)庫文件(此處以g++編譯器為例)

g++ -shared -fPIC -c XXX.cpp

g++ -shared -fPIC -o XXX.so XXX.o

2、 .so動態(tài)庫的動態(tài)調(diào)用接口函數(shù)說明

動態(tài)庫的調(diào)用關(guān)系可以在需要調(diào)用動態(tài)庫的程序編譯時,通過g++的-L和-l命令來指定。例如:程序test啟動時需要加載目錄/root/src/lib中的libtest_so1.so動態(tài)庫,編譯命令可照如下編寫執(zhí)行:

g++ -g -o test test.cpp –L/root/src/lib –ltest_so1

(此處,我們重點講解動態(tài)庫的動態(tài)調(diào)用的方法,關(guān)于靜態(tài)的通過g++編譯命令調(diào)用的方式不作詳細(xì)講解,具體相關(guān)內(nèi)容可上網(wǎng)查詢)

Linux下,提供專門的一組API用于完成打開動態(tài)庫慧蘆,查找符號,處理出錯,關(guān)閉動態(tài)庫等功能。

下面對這些接口函數(shù)逐一介紹(調(diào)用這些接口時,需引用頭文件#include ):

1)dlopen

函數(shù)原型:void *dlopen(const char *libname,int flag);

功能描述:dlopen必須在dlerror,dlsym和dlclose之前調(diào)用,表示要將庫裝載到內(nèi)存,準(zhǔn)備使用。如果要裝載的庫依賴于其它庫,必須首先裝載依賴庫。如果dlopen操作失敗,返回NULL值;如果庫已經(jīng)被裝載過,則dlopen會返回同樣的句柄。

參數(shù)中的libname一般是庫的全路徑,這樣dlopen會直接裝載該文件;如果只是指定了庫名稱,在dlopen會按照下面的機(jī)制去搜尋:

a.根據(jù)環(huán)境變量LD_LIBRARY_PATH查找

b.根據(jù)/etc/ld.so.cache查找

c.查找依次在/lib和/usr/lib目錄查找。

flag參數(shù)表示處理未定義函數(shù)的方式,可以使用RTLD_LAZY或RTLD_NOW。RTLD_LAZY表示暫時不去處理未定義函數(shù),迅搜先把庫裝載到內(nèi)存,等用到?jīng)]定義的函數(shù)再說;RTLD_NOW表示馬上檢查是否存在未定義的函數(shù),若存在,則dlopen以失敗告終。

2)dlerror

函數(shù)原型:char *dlerror(void);

功能描述:dlerror可以獲得最近一次dlopen,dlsym或dlclose操作的錯誤信息,返回NULL表示無錯誤。dlerror在返回錯誤信息的同時,也會清除錯誤信息。

3)dlsym

函數(shù)原型:void *dlsym(void *handle,const char *symbol);

功能描述:在dlopen之后,庫被裝載到內(nèi)存。dlsym可以獲得指定函數(shù)(symbol)在內(nèi)前昌帶存中的位置(指針)。如果找不到指定函數(shù),則dlsym會返回NULL值。但判斷函數(shù)是否存在更好的方法是使用dlerror函數(shù),

4)dlclose

函數(shù)原型:int dlclose(void *);

功能描述:將已經(jīng)裝載的庫句柄減一,如果句柄減至零,則該庫會被卸載。如果存在析構(gòu)函數(shù),則在dlclose之后,析構(gòu)函數(shù)會被調(diào)用。

3、 普通函數(shù)的調(diào)用

此處以源碼實例說明。各源碼文件關(guān)系如下:

test_so1.h和test_so1.cpp生成test_so1.so動態(tài)庫。

test_so2.h和test_so2.cpp生成test_so2.so動態(tài)庫。

test_dl.cpp生成test_dl可執(zhí)行程序,test_dl通過dlopen系列等API函數(shù),并使用函數(shù)指針以到達(dá)動態(tài)調(diào)用不同so庫中test函數(shù)的目的。

如何判斷l(xiāng)inux 動態(tài)庫調(diào)用

創(chuàng)建靜態(tài)庫:

ar -rcs test.a *.o

查看靜態(tài)庫:

ar -tv test.a

解壓靜態(tài)庫:

ar -x test.a

查看程序依賴的動態(tài)庫:

readelf -a xxx|grep library

如:可以看到,下面的交饑賀叉程序hello執(zhí)行依賴于如下兩個動態(tài)庫。

rebi@ubuntu:~/test$ arm-none-linux-gnueabi-readelf -a hello|grep “l(fā)ibrary”

0x(NEEDED)Shared library:

0x(NEEDED)Shared library:

rebi@ubuntu:~/test$

或者跡嘩:readelf -l hello 即可。

nm xxx 查看符號

關(guān)于linux測試動態(tài)庫接口的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

成都網(wǎng)站設(shè)計制作選創(chuàng)新互聯(lián),專業(yè)網(wǎng)站建設(shè)公司。
成都創(chuàng)新互聯(lián)10余年專注成都高端網(wǎng)站建設(shè)定制開發(fā)服務(wù),為客戶提供專業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁設(shè)計,成都網(wǎng)站設(shè)計服務(wù);成都創(chuàng)新互聯(lián)服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),小程序開發(fā),營銷網(wǎng)站建設(shè),網(wǎng)站改版,服務(wù)器托管租用等互聯(lián)網(wǎng)服務(wù)。


網(wǎng)站欄目:Linux下動態(tài)庫接口測試簡易指南 (linux測試動態(tài)庫接口)
文章分享:http://www.5511xx.com/article/cdespgo.html