امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 4
  • 1
  • 2
  • 3
  • 4
  • 5
تغییر مسیر خطاها در لینوکس
نویسنده پیام
nImaarek آفلاین
badtrip
****

ارسال‌ها: 144
موضوع‌ها: 61
تاریخ عضویت: مهر ۱۳۸۹

تشکرها : 310
( 317 تشکر در 108 ارسال )
ارسال: #1
تغییر مسیر خطاها در لینوکس
سلام،

من یه برنامه دارم که داخل چندین فایل so و بارگذاری میکنه. حالا من میتونم در برنامه ی خودم اگر هرکدام از این so خطا داد آن را در فایل ذخیره کردنم؟
یه سوال دیگه بعضی از firmware ها قبل از بوت شدن پیغام های خطا رو لاگ میکنن اینا چطوری کار میکنن؟

One Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them

Tell me, what you think about me
Give anonymous feedback
۲۹-مرداد-۱۳۹۸, ۱۷:۱۰:۰۶
وب سایت ارسال‌ها
پاسخ
babyy آفلاین
بازنشسته
*****

ارسال‌ها: 3,095
موضوع‌ها: 141
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 35081
( 26090 تشکر در 9068 ارسال )
ارسال: #2
RE: تغییر مسیر خطاها در لینوکس
سلام

تا جایی که میدونم اگه برنامه ای بخواد فایل so ای رو لود کنه و وجود نداشته باشه؛ اصلا برنامه اجرا نمیشه .. در نتیجه خودش نمیتونه بفهمه کدوم فایل so ای موجود نبود؛ چون اصلا اجرا نشده .. (مگر اینکه روش و متدی وجود داشته باشه که من بی اطلاع باشم ازش)

مگر اینکه فایل‌ها بصورت دینامیکی توسط خود برنامه در حین اجرا بخوان لود بشند؛ که اگر به این شکل باشه میتونید متوجه بشید فایل so وجود نداره و خطا رو درون فایل چاپ کنید و ..

-----------
در مورد فریم‌ور ها هم که همونطور که میدونی اول هسته لود میشه؛ و بعد از اون برنامه ها توسط هسته لود میشند..
یعنی اون خطاهایی که چاپ میشه توسط خود برنامه‌ای که فایل SO اش ناقص هست چاپ نمیشه‌؛ توسط هسته چاپ میشه؛‌

توسط یه برنامه‌ی دیگه (هسته؛ لودر و ..) میشه فهمید فایل so یه برنامه دیگه وجود داره یا نه ..
مثل کاری که ldd یا strace میکنه ... 




چیزایی بود که من میدونستم؛ احتمالا متد های دیگه ای هم هستند که بی خبرم ازش خنده بلد − بهینه شده برای ورژن جدید
۳۰-مرداد-۱۳۹۸, ۰۸:۲۶:۳۲
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : nImaarek, hadikh73, 1نفر, salehjg
nImaarek آفلاین
badtrip
****

ارسال‌ها: 144
موضوع‌ها: 61
تاریخ عضویت: مهر ۱۳۸۹

تشکرها : 310
( 317 تشکر در 108 ارسال )
ارسال: #3
RE: تغییر مسیر خطاها در لینوکس
مرسی ولی کلا اشتباه متوجه شدی. البته منم بد نوشتم.
بحث بارگذاری نشدن فایل های so نیست.
ببینید من چندتا so تو خودم بارگذاری میکنم و فایل های so هم با موفقیت dlopen میشن. حالا فرض کنید یکی از so ها داخل توابع خودش یه exception هندل کرد و خطا رو print کرد.
من میخوام بدونم من تو برنامه اصلیم چطوری میتونم این خطا هایی که so هام چاپ میکنن تو فایل ذخیره کنم یا اصطلاحا لاگ بگیرم؟
تابع printf هوک کنم؟ یا راه های ساده تری هم هست؟

One Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them

Tell me, what you think about me
Give anonymous feedback
۳۰-مرداد-۱۳۹۸, ۰۹:۲۱:۳۵
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : salehjg
babyy آفلاین
بازنشسته
*****

ارسال‌ها: 3,095
موضوع‌ها: 141
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 35081
( 26090 تشکر در 9068 ارسال )
ارسال: #4
RE: تغییر مسیر خطاها در لینوکس
یه مثال بزن بریم در فروم های خارجی بپرسیم خنده بلد − بهینه شده برای ورژن جدید
اونا بلدند خنده بلد − بهینه شده برای ورژن جدید
۰۳-شهریور-۱۳۹۸, ۱۴:۲۳:۴۰
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : 1نفر, salehjg, nImaarek
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #5
RE: تغییر مسیر خطاها در لینوکس
این برعکس چیزیه که شما دنبالشی فکر کنم:
https://stackoverflow.com/questions/3576...ed-library

024
ولی جوری که این سوال پرسیده، انگار در حالت عادی از کتابخونه استاتیک هم محتوای پرینت ها به برنامه اصلی میان.
احتمالا شما دنبال stderr بجای stdoutباید باشید

البته اگر منظور این هست که اگر so باعث کرش برنامه اصلی بشه، چطور متن خطا رو گرفت، نمیدونم چه اتفاقاتی میوفته :دی
(زیاد جدی نگیرید حرفای منو :دی )
(آخرین ویرایش در این ارسال: ۰۴-شهریور-۱۳۹۸, ۰۵:۴۹:۰۷، توسط salehjg.)
۰۴-شهریور-۱۳۹۸, ۰۰:۵۷:۰۴
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : babyy, 1نفر, nImaarek
nImaarek آفلاین
badtrip
****

ارسال‌ها: 144
موضوع‌ها: 61
تاریخ عضویت: مهر ۱۳۸۹

تشکرها : 310
( 317 تشکر در 108 ارسال )
ارسال: #6
RE: تغییر مسیر خطاها در لینوکس
آقااااااااااا چرا انقدر سختش میکنید؟ قلب عشق - بهینه شده برای ورژن جدید
میدونید که pipe چطوری کار میکنه؟
منظورم تابع پایپ تو سی هست نه کارکتر "|" تو ترمینال. البته فرقی هم نمیکنند ولی در کل من میخوام مثل استفاده از پایپ خروجی یا همون stdout پروسس ها را ذخیره کنم داخل فایل.
اما چرا نمیتونم از پایپ استفاده کنم؟ چون پایپ به یه برنامه دومی هم نیاز پیدا میکنه که برنامه اصلی که so ها توشن و اجرا کنه و ...
اوکی؟ راه حل دیگه هست؟  :X(: 

آقای مدییییییییییییییر بخش لینوکس شادی − بهینه شده برای ورژن جدید

One Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them

Tell me, what you think about me
Give anonymous feedback
(آخرین ویرایش در این ارسال: ۰۵-شهریور-۱۳۹۸, ۰۲:۰۹:۵۴، توسط nImaarek.)
۰۵-شهریور-۱۳۹۸, ۰۲:۰۹:۳۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : babyy, 1نفر
babyy آفلاین
بازنشسته
*****

ارسال‌ها: 3,095
موضوع‌ها: 141
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 35081
( 26090 تشکر در 9068 ارسال )
ارسال: #7
RE: تغییر مسیر خطاها در لینوکس
(۰۵-شهریور-۱۳۹۸, ۰۲:۰۹:۳۹)nImaarek نوشته است: آقااااااااااا چرا انقدر سختش میکنید؟ قلب عشق - بهینه شده برای ورژن جدید
میدونید که pipe چطوری کار میکنه؟
منظورم تابع پایپ تو سی هست نه کارکتر "|" تو ترمینال. البته فرقی هم نمیکنند ولی در کل من میخوام مثل استفاده از پایپ خروجی یا همون stdout پروسس ها را ذخیره کنم داخل فایل.
اما چرا نمیتونم از پایپ استفاده کنم؟ چون پایپ به یه برنامه دومی هم نیاز پیدا میکنه که برنامه اصلی که so ها توشن و اجرا کنه و ...
اوکی؟ راه حل دیگه هست؟  :X(: 

آقای مدییییییییییییییر بخش لینوکس شادی − بهینه شده برای ورژن جدید

خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید  شاید باورت نشه؛ ولی نفهمیدم بازم خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید

الان تو یه برنامه داری بنام aaa که یه فایل  so رو لود میکنه؛
یه خطا رخ میده توی so ؛ اون so  خطا رو هندل میکنه و یه چیزی توی خروجی (stderr) چاپ میکنه
حالا تو میخوایی توی برنامه aaa خطای این so رو خودت دریافت کنی؛ و توی فایل ذخیره کنی؛ درسته؟ 


خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید  من تا همین حد فهمیدم؛ اون پایپ هم توضیح بده یاد بگیریم خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید
۰۵-شهریور-۱۳۹۸, ۱۴:۲۶:۱۶
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : nImaarek
nImaarek آفلاین
badtrip
****

ارسال‌ها: 144
موضوع‌ها: 61
تاریخ عضویت: مهر ۱۳۸۹

تشکرها : 310
( 317 تشکر در 108 ارسال )
ارسال: #8
RE: تغییر مسیر خطاها در لینوکس
aaa چندتا so داره.
من سورس so ها رو ندارم!
حالا فرض کن هرکدوم از این so یه چیزی printf میکنن
من میخوام اگر این  so ها پیغام یا هر رشته ای که printf کردن
تو فایل ذخیره کنم!!

همیـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــن

One Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them

Tell me, what you think about me
Give anonymous feedback
۰۵-شهریور-۱۳۹۸, ۲۳:۵۱:۵۲
وب سایت ارسال‌ها
پاسخ
babyy آفلاین
بازنشسته
*****

ارسال‌ها: 3,095
موضوع‌ها: 141
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 35081
( 26090 تشکر در 9068 ارسال )
ارسال: #9
RE: تغییر مسیر خطاها در لینوکس
فایل 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.


فایل main.c که از توابع فایل so استفاده میکنه:
کد php:
#include <stdio.h>

void bb1();
void bb2();

int main()
{
    bb1();
    bb2();
    printf("inC\n");



با دستور زیر کامپایل میکنیم:

کد php:
gcc -o main bb.so  main.



این رو هم اجرا میکنیم در شل که جاهای دور دنبال فایل so نگرده خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید
کد php:
export LD_LIBRARY_PATH=. 


اجرا میکنیم و تست میگیریم:

کد php:
$ ./main 
Err1
Err2
inC 


حالا اررور ها رو حذف میکنیم ار خروجی:
کد php:
$ ./main 2>/dev/null 
inC 


و حالا خروجی استاندارد رو حذف میکنیم:
کد 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 هست) رو توی فایل ذخیره کنه؛ و سومی هم که باید بینیم:

کد php:
$ ./main
Err1
inC 

و

کد php:
cat stderr.log 
Err2 


یعنی بعد از تنظیم و استفاده ار freopen هرچی خطا بخواد چاپ بشه؛ میره توی فایلی که بهش معرفی کردیم ...


تابعش هم از اینجا پیدا کردم خنده بلد − بهینه شده برای ورژن جدید
https://cboard.cprogramming.com/linux-pr...stdin.html


خنده بلد − بهینه شده برای ورژن جدید  همین بود مشکلت؟ اگه همین نبود دیگه خداییش یه مثال بزن خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید
(آخرین ویرایش در این ارسال: ۰۸-شهریور-۱۳۹۸, ۰۰:۳۱:۴۷، توسط babyy.)
۰۸-شهریور-۱۳۹۸, ۰۰:۱۸:۱۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : 1نفر, lord_viper, salehjg, nImaarek, omid_phoenix
nImaarek آفلاین
badtrip
****

ارسال‌ها: 144
موضوع‌ها: 61
تاریخ عضویت: مهر ۱۳۸۹

تشکرها : 310
( 317 تشکر در 108 ارسال )
ارسال: #10
RE: تغییر مسیر خطاها در لینوکس
همین درسته  دست زدن - بهینه شده برای ورژن جدید    :():

One Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them

Tell me, what you think about me
Give anonymous feedback
۲۱-شهریور-۱۳۹۸, ۰۰:۰۰:۵۱
وب سایت ارسال‌ها
پاسخ
babyy آفلاین
بازنشسته
*****

ارسال‌ها: 3,095
موضوع‌ها: 141
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 35081
( 26090 تشکر در 9068 ارسال )
ارسال: #11
RE: تغییر مسیر خطاها در لینوکس
(۲۱-شهریور-۱۳۹۸, ۰۰:۰۰:۵۱)nImaarek نوشته است: همین درسته  دست زدن - بهینه شده برای ورژن جدید    :():

خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید  خدارو شکر؛ فکر کردم بازم متوجه سوال نشدم خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید
۲۱-شهریور-۱۳۹۸, ۰۰:۴۸:۱۴
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : nImaarek


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  [سوال] چطوری یه wrapper بنویسم ؟ (سی در لینوکس) nImaarek 5 3,656 ۲۳-خرداد-۱۳۹۶, ۰۴:۱۳:۱۷
آخرین ارسال: babyy
  تغییر نوع عکس فروم باز 0 2,067 ۰۵-فروردین-۱۳۸۹, ۱۴:۰۰:۴۹
آخرین ارسال: فروم باز
  مشتق گیری در سی++ تحت لینوکس kimia 4 4,298 ۱۴-دى-۱۳۸۵, ۲۰:۱۷:۴۶
آخرین ارسال: Mamad2003
  تغییر کرسر ماوس pswin 1 2,280 ۲۸-آذر-۱۳۸۵, ۲۲:۳۹:۱۰
آخرین ارسال: Iron_Fist

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS