سلام،
من یه برنامه دارم که داخل چندین فایل so و بارگذاری میکنه. حالا من میتونم در برنامه ی خودم اگر هرکدام از این so خطا داد آن را در فایل ذخیره کردنم؟
یه سوال دیگه بعضی از firmware ها قبل از بوت شدن پیغام های خطا رو لاگ میکنن اینا چطوری کار میکنن؟
سلام
تا جایی که میدونم اگه برنامه ای بخواد فایل so ای رو لود کنه و وجود نداشته باشه؛ اصلا برنامه اجرا نمیشه .. در نتیجه خودش نمیتونه بفهمه کدوم فایل so ای موجود نبود؛ چون اصلا اجرا نشده .. (مگر اینکه روش و متدی وجود داشته باشه که من بی اطلاع باشم ازش)
مگر اینکه فایلها بصورت دینامیکی توسط خود برنامه در حین اجرا بخوان لود بشند؛ که اگر به این شکل باشه میتونید متوجه بشید فایل so وجود نداره و خطا رو درون فایل چاپ کنید و ..
-----------
در مورد فریمور ها هم که همونطور که میدونی اول هسته لود میشه؛ و بعد از اون برنامه ها توسط هسته لود میشند..
یعنی اون خطاهایی که چاپ میشه توسط خود برنامهای که فایل SO اش ناقص هست چاپ نمیشه؛ توسط هسته چاپ میشه؛
توسط یه برنامهی دیگه (هسته؛ لودر و ..) میشه فهمید فایل so یه برنامه دیگه وجود داره یا نه ..
مثل کاری که ldd یا strace میکنه ...
چیزایی بود که من میدونستم؛ احتمالا متد های دیگه ای هم هستند که بی خبرم ازش
مرسی ولی کلا اشتباه متوجه شدی. البته منم بد نوشتم.
بحث بارگذاری نشدن فایل های so نیست.
ببینید من چندتا so تو خودم بارگذاری میکنم و فایل های so هم با موفقیت dlopen میشن. حالا فرض کنید یکی از so ها داخل توابع خودش یه exception هندل کرد و خطا رو print کرد.
من میخوام بدونم من تو برنامه اصلیم چطوری میتونم این خطا هایی که so هام چاپ میکنن تو فایل ذخیره کنم یا اصطلاحا لاگ بگیرم؟
تابع printf هوک کنم؟ یا راه های ساده تری هم هست؟
یه مثال بزن بریم در فروم های خارجی بپرسیم
اونا بلدند
این برعکس چیزیه که شما دنبالشی فکر کنم:
https://stackoverflow.com/questions/3576...ed-library
ولی جوری که این سوال پرسیده، انگار در حالت عادی از کتابخونه استاتیک هم محتوای پرینت ها به برنامه اصلی میان.
احتمالا شما دنبال stderr بجای stdoutباید باشید
البته اگر منظور این هست که اگر so باعث کرش برنامه اصلی بشه، چطور متن خطا رو گرفت، نمیدونم چه اتفاقاتی میوفته :دی
(زیاد جدی نگیرید حرفای منو :دی )
آقااااااااااا چرا انقدر سختش میکنید؟
میدونید که pipe چطوری کار میکنه؟
منظورم تابع پایپ تو سی هست نه کارکتر "|" تو ترمینال. البته فرقی هم نمیکنند ولی در کل من میخوام مثل استفاده از پایپ خروجی یا همون stdout پروسس ها را ذخیره کنم داخل فایل.
اما چرا نمیتونم از پایپ استفاده کنم؟ چون پایپ به یه برنامه دومی هم نیاز پیدا میکنه که برنامه اصلی که so ها توشن و اجرا کنه و ...
اوکی؟ راه حل دیگه هست؟ :X(:
آقای مدییییییییییییییر بخش لینوکس
aaa چندتا so داره.
من سورس so ها رو ندارم!
حالا فرض کن هرکدوم از این so یه چیزی printf میکنن
من میخوام اگر این so ها پیغام یا هر رشته ای که printf کردن
تو فایل ذخیره کنم!!
همیـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــن
فایل so بنام bb,so که شامل دوتا تابع هست که توی stderr یا همون خروجی استاندارد خطاها پرینت میگیرند ..
کد php:
#include <stdio.h>
void bb1()
{
fprintf(stderr,"Err1\n");
}
void bb2()
{
fprintf(stderr,"Err2\n");
}
با دستور زیر فایل so ایجاد میکنیم:
کد php:
gcc -o bb.so -shared -fPIC bb.c
فایل main.c که از توابع فایل so استفاده میکنه:
کد php:
#include <stdio.h>
void bb1();
void bb2();
int main()
{
bb1();
bb2();
printf("inC\n");
}
با دستور زیر کامپایل میکنیم:
این رو هم اجرا میکنیم در شل که جاهای دور دنبال فایل so نگرده
اجرا میکنیم و تست میگیریم:
حالا اررور ها رو حذف میکنیم ار خروجی:
و حالا خروجی استاندارد رو حذف میکنیم:
کد php:
$ ./main 1>/dev/null
Err1
Err2
پس تا اینجای کار یه تابع در so داریم که داره توی خروجی خطا چاپ میکنه ...
حالا چطوری خطاها رو توسط برنامه مدیریت کنیم؟ توسط تابع freopen
کد main رو به این شکل تغییر میدیم:
کد php:
#include <stdio.h>
void bb1();
void bb2();
int main()
{
bb1();
freopen( "stderr.log", "w", stderr );
bb2();
printf("inC\n");
}
چیزی انتظار داریم اینه که خطای اول رو در خروجی ببینیم؛ خطای دوم (و هرچی خطای دیگه بعد از اجرای freopen هست) رو توی فایل ذخیره کنه؛ و سومی هم که باید بینیم:
و
یعنی بعد از تنظیم و استفاده ار freopen هرچی خطا بخواد چاپ بشه؛ میره توی فایلی که بهش معرفی کردیم ...
تابعش هم از اینجا پیدا کردم
https://cboard.cprogramming.com/linux-pr...stdin.html
همین بود مشکلت؟ اگه همین نبود دیگه خداییش یه مثال بزن