2017-07-03 208 views
1

程序運行至getsockname,返回值爲-1,errno爲9(EBADF,壞文件描述符)。但是,Android應用程序中的代碼運行良好。getsockname返回-1,errno是EBADF?

void sysLibCSendHookHandler(CPUState* env, int isStart){ 

if(isStart){ 
    int fd = env->regs[0]; 
    int buf = env->regs[1]; 
    int len = env->regs[2]; 
    int flags = env->regs[3]; 
    DECAF_printf("xxxxx send(%d, %p, %d, %d)\n", fd, buf, len, flags); 
    extern int errno; 
    struct sockaddr_un sock_addr; 
    socklen_t sock_addr_len; 
    sock_addr_len = sizeof(sock_addr); 
    int t = getsockname(fd, (struct sockaddr*)&sock_addr, &sock_addr_len); 
    DECAF_printf("fd:%d",fd);} 
+0

*「但是,在Android應用程序中安裝的代碼進行得很順利......」* - 這是否意味着問題出在模擬器中? – jww

+1

'EBADF'表示傳遞給'getsockname()'的文件描述符無效。這段代碼*暗示*你以某種方式掛鉤了send()函數,對嗎?究竟如何?該代碼假設參數正在傳遞到CPU寄存器中,但它們通常是在堆棧上傳遞的。是什麼讓你認爲'send()'參數被存儲在'env-> regs []'中? –

回答

2

該代碼產生不確定的行爲:

extern int errno; 

7.5錯誤< errno.h中>的the C Standard(注意粗體部分):

頭定義了幾個宏,所有與錯誤條件的報告有關的 。

的宏

EDOM 
EILSEQ 
ERANGE 

其擴展到整數,int類型,不同 正值常量表達式,並且其適合於在#if預處理 指令使用;和

errno 

其擴展到具有鍵入int和 線程本地存儲的持續時間,其值是由幾個庫函數設定爲 正誤差數目的修改的左值。 如果爲了訪問實際對象而禁止了宏 定義,則 或程序定義了名稱爲errno的標識符,因此 行爲未定義。

按照Google Android source codeerrno是被定義爲

extern int *__geterrno(void); 

#define errno (*__geterrno()) 

既然如此,你extern int errno你看到的值是無意義的宏。