- 論壇徽章:
- 0
|
Hi ALL,
小弟最近在ARM平臺(tái)的uclinux系統(tǒng)上寫程序,發(fā)現(xiàn)了一個(gè)問(wèn)題,在這里和大家共享一下,希望能得到大家的幫助!先謝啦!
問(wèn)題描述:我在程序中通過(guò)vfork產(chǎn)生一個(gè)子進(jìn)程,在子進(jìn)程中通過(guò)exec函數(shù)族加載執(zhí)行一個(gè)新的executable,暫且把這個(gè)新executable叫做B,B中有一個(gè)大的全局?jǐn)?shù)組,所以導(dǎo)致其bss段很大,execve執(zhí)行B時(shí),kernel加載B失敗,按理exec應(yīng)該返回錯(cuò)誤,但是現(xiàn)在exec沒(méi)有返回,其在kernel中的call chain如下:
sys_execve()->do_execve()->search_binary_handler()->load_flat_binary()->load_flat_file()...
通過(guò)debug,現(xiàn)在基本上確定導(dǎo)致exec不返回的代碼是在load_flat_file()中,代碼如下:
===================================================
/* Flush all traces of the currently running executable */
if (id == 0) {
result = flush_old_exec(bprm);
if (result) {
ret = result;
goto err;
}
/* OK, This is the point of no return */
set_personality(PER_LINUX_32BIT);
}
==========================================================
在上面這段代碼后面,就是do_mmap() for text, data/bss section了,而我的程序B就是在do_mmap() for data/bss時(shí)因內(nèi)存不夠失敗的。
我想知道的是:load_flat_file()返回錯(cuò)誤后,call chain上就沒(méi)有函數(shù)做一些資源釋放或者rollback方面的工作嗎?因?yàn)槲矣谩皃s“命令查看,B進(jìn)程一直處在運(yùn)行狀態(tài),但是進(jìn)程名加了中括號(hào)。exec函數(shù)沒(méi)有返回,使用waitpid也檢測(cè)不到狀態(tài)改變。 |
|