আমি কীভাবে সিগসাইজিভি (সেগমেন্টেশন ফল্ট) ধরতে পারি এবং অ্যান্ড্রয়েডে জেএনআইয়ের অধীনে স্ট্যাক ট্রেস পেতে পারি?


92

আমি একটি প্রজেক্ট নতুন অ্যান্ড্রয়েড নেটিভ ডেভলপমেন্ট কিটে (যেমন জেএনআই) সরিয়ে নিয়ে যাচ্ছি এবং আমি সিগসাইজিভি ধরতে চাই, এটির পরিবর্তে একটি দুর্দান্ত ক্র্যাশ রিপোর্টিং সংলাপ উপস্থাপনের জন্য (সম্ভবত সিগিল, সিগাব্যাট, সিএসএফপিপি) হওয়া উচিত কি? (বা তার আগে) বর্তমানে যা ঘটে: প্রক্রিয়াটির তাত্ক্ষণিক অনিয়ম মৃত্যু এবং সম্ভবত এটি পুনরায় চালু করার জন্য ওএসের কিছু প্রচেষ্টা। ( সম্পাদনা করুন: জেভিএম / ডালভিক ভিএম সিগন্যালটি ধরে এবং একটি স্ট্যাক ট্রেস এবং অন্যান্য দরকারী তথ্য লগ করে; আমি কেবল ব্যবহারকারীকে আমার কাছে সেই তথ্যটি ইমেল করার বিকল্পটি দিতে চাই want)

পরিস্থিতিটি হ'ল: আমি লিখি নি এমন সি কোডের একটি বৃহত সংস্থা এই অ্যাপ্লিকেশনটিতে (বেশিরভাগ গেমের যুক্তি) বেশিরভাগ কাজ করে এবং যদিও এটি অন্যান্য অনেক প্ল্যাটফর্মে ভালভাবে পরীক্ষা করা হয়েছে তবে এটি সম্পূর্ণ সম্ভব যে আমি আমার অ্যান্ড্রয়েডে পোর্ট, এটিকে আবর্জনা খাওয়াবে এবং নেটিভ কোডে ক্রাশ ঘটাবে, সুতরাং আমি ক্র্যাশ ডাম্পগুলি (নেটিভ এবং জাভা উভয়) চাই যা বর্তমানে অ্যান্ড্রয়েড লগে প্রদর্শিত হয় (আমার ধারণা এটি অ-অ্যান্ড্রয়েড পরিস্থিতিতে স্ট্যাডার হবে)। আমি সি এবং জাভা উভয় কোডকে নির্বিচারে সংশোধন করতে মুক্ত, যদিও কলব্যাকস (জেএনআই থেকে আসা এবং বেরিয়ে আসা) উভয়ই প্রায় 40 নম্বর এবং স্পষ্টতই, ছোট ডিফারগুলির জন্য বোনাস পয়েন্ট।

আমি J2SE, libjsig.so এর সিগন্যাল চেইন লাইব্রেরির কথা শুনেছি, এবং যদি আমি অ্যান্ড্রয়েডে নিরাপদে এমন একটি সিগন্যাল হ্যান্ডলার ইনস্টল করতে পারি তবে এটি আমার প্রশ্নের আকর্ষণীয় অংশটি সমাধান করতে পারে, তবে আমি অ্যান্ড্রয়েড / ডালভিকের মতো কোনও লাইব্রেরি দেখতে পাই না ।


আপনি যদি একটি মোড়ক স্ক্রিপ্টের মাধ্যমে জাভা ভিএম শুরু করতে পারেন, আপনি অ্যাপটি অস্বাভাবিকভাবে বেরিয়ে এসেছেন কিনা তা পরীক্ষা করতে পারেন এবং ত্রুটি প্রতিবেদন করতে পারেন। এটি আপনাকে পরিষ্কারভাবে সমস্ত ধরণের অস্বাভাবিক প্রস্থানগুলি ধরতে দেয়, সেগুলি সিগসিজিভি, সিগ্কিল বা যাই হোক না কেন। তবে, স্টক অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলির মাধ্যমে এটি সম্ভব বলে আমি মনে করি না, সুতরাং এটি মন্তব্য হিসাবে পোস্ট করা (উত্তর থেকে রূপান্তরিত)।
sleske

এছাড়াও দেখুন: একটি মোড়ক স্ক্রিপ্ট (অ্যাডবি শেল) দিয়ে কীভাবে একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন শুরু করা যায় তার জন্য ভ্যালগ্রিন্ডের সাথে একটি জাভা অ্যান্ড্রয়েড প্রোগ্রাম চালানো যায় না
sleske

4
উত্তরটি আপডেট করা দরকার। গৃহীত উত্তরে প্রদত্ত উত্স কোড অ্যাসিঙ্ক-সিগন্যাল-নিরাপদ ফাংশনগুলিতে কল করার কারণে অপরিজ্ঞিত আচরণের ফলাফল করবে। : দয়া করে এখানে দেখতে stackoverflow.com/questions/34547199/...
user1506104

উত্তর:


82

সম্পাদনা করুন: জেলি বিন থেকে পরবর্তীকালে আপনি স্ট্যাকের ট্রেস পাবেন না, কারণ READ_LOGSচলে গেছে । :-(

আমি আসলে খুব বেশি বিদেশী কিছু না করে কাজ করে একটি সিগন্যাল হ্যান্ডলার পেয়েছি এবং এটি ব্যবহার করে কোড প্রকাশ করেছে, যা আপনি গিথুব এ দেখতে পাবেন (সম্পাদনা করুন: historical তিহাসিক প্রকাশের সাথে সংযুক্ত; আমি তখন থেকে ক্র্যাশ হ্যান্ডলারটিকে সরিয়ে দিয়েছি)। এখানে কীভাবে:

  1. sigaction()সিগন্যালগুলি ধরতে এবং পুরানো হ্যান্ডলারগুলি সঞ্চয় করতে ব্যবহার করুন । ( android.c: 570 )
  2. সময় কেটে যায়, একটি সেগফল্ট ঘটে।
  3. সিগন্যাল হ্যান্ডলারে, শেষ বারের মতো জেএনআই-তে কল করুন এবং তারপরে পুরানো হ্যান্ডলারটি কল করুন। ( android.c: 528 )
  4. সেই জেএনআই কলটিতে, কোনও দরকারী ডিবাগিং তথ্য লগ করুন এবং startActivity()এমন একটি ক্রিয়াকলাপটি কল করুন যা তার নিজস্ব প্রক্রিয়াতে থাকা হিসাবে পতাকাঙ্কিত হয়েছে। ( এসজিটিপ্লেজস.জভা : ৯6262 , অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল : ২৮ )
  5. আপনি যখন জাভা থেকে ফিরে এসে সেই পুরানো হ্যান্ডলারটি কল করবেন তখন অ্যান্ড্রয়েড কাঠামোটি আপনার debuggerdজন্য একটি সুন্দর নেটিভ ট্রেস লগ করতে সংযোগ করবে এবং তারপরে প্রক্রিয়াটি মারা যাবে। ( debugger.c , debuggerd.c )
  6. ইতিমধ্যে, আপনার ক্র্যাশ-হ্যান্ডলিং ক্রিয়াকলাপটি শুরু হচ্ছে। সত্যিই আপনার এটি পিআইডি পাস করা উচিত যাতে এটি 5 ধাপটি সম্পন্ন হওয়ার জন্য অপেক্ষা করতে পারে; আমি এই না। এখানে আপনি ব্যবহারকারীর কাছে ক্ষমা চান এবং আপনি কোনও লগ প্রেরণ করতে পারেন কিনা তা জিজ্ঞাসা করুন। যদি তা হয় তবে আউটপুট সংগ্রহ করুন logcat -d -v threadtimeএবং ACTION_SENDপ্রাপক, বিষয় এবং বর্ধিত দেহ সহ একটি চালু করুন The ব্যবহারকারীকে প্রেরণ টিপতে হবে। ( CrashHandler.java , SGTPuzzles.java:462 , strings.xml: 41
  7. logcatব্যর্থ হওয়া বা কয়েক সেকেন্ডের বেশি সময় নেওয়ার জন্য নজর রাখুন। আমি একটি ডিভাইসের মুখোমুখি হয়েছি, টি-মোবাইল পালস / হুয়াওয়ে U8220, যেখানে লগক্যাটটি তাত্ক্ষণিকভাবে T( ট্রেসড ) অবস্থায় যায় এবং স্তব্ধ হয়ে যায়। ( ক্র্যাশহ্যান্ডলিরজাভা : 70০ , স্ট্রিং.এক্সএমএল : ৫১ )

অ-অ্যান্ড্রয়েড পরিস্থিতিতে, এর কিছু আলাদা হবে। আপনার নিজের দেশীয় ট্রেস সংগ্রহ করা দরকার, আপনার কী ধরণের লিবিসি রয়েছে তার উপর নির্ভর করে এই অন্যান্য প্রশ্নটি দেখুন । আপনাকে সেই ট্রেসটি ডাম্পিং করা, আপনার পৃথক ক্রাশ-হ্যান্ডলার প্রক্রিয়া আরম্ভ করার জন্য এবং আপনার প্ল্যাটফর্মের জন্য কিছু উপযুক্ত উপায়ে ইমেল প্রেরণ করা দরকার, তবে আমি ধারণা করি যে সাধারণ পদ্ধতির এখনও কাজ করা উচিত।


4
আদর্শভাবে আপনি ক্রাশটি আপনার লাইব্রেরিতে ঘটেছিল কিনা তা পরীক্ষা করে দেখুন। যদি এটি অন্য কোথাও ঘটে থাকে (বলুন, ভিএম এর অভ্যন্তরে), আপনার জেএনআই কলগুলি সিগন্যাল হ্যান্ডলার থেকে কলগুলি বরং খারাপভাবে বিভ্রান্ত করতে পারে। এটি বিশ্বের শেষ নয়, যেহেতু আপনি মিড ক্র্যাশ হোন না কেন, তবে এটি কোনও ভিএম ক্র্যাশের সনাক্তকরণ আরও জটিল করে তুলতে পারে (বা একটি উদ্ভট ভিএম ক্র্যাশ ঘটায় যা অ্যান্ড্রয়েড বাগ রিপোর্টে এসে সবাইকে অবাক করে দেয়)।
5:38

আপনার গবেষণা প্রকল্পটি ভাগ করে নেওয়ার জন্য আপনি দুর্দান্ত @ ক্রিস!
olafure

ধন্যবাদ, আমার জেএনআই বাদাম কোথায় যাচ্ছে তা সন্ধানে এটি দরকারী ছিল। এছাড়াও, একটি ডিসিএস প্রাক্তন ছাত্র থেকে হ্যালো!
নিক

4
কোনও পরিষেবা থেকে একটি নতুন প্রক্রিয়াতে ক্রিয়াকলাপ শুরু করার জন্য নিম্নলিখিত newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
গ্রিম

4
এই সমাধানটি এখনও জেলি বিনের অধীনে বৈধ? পদক্ষেপ 6 কোনও ফলাফল debuggerdআউটপুট লগ করতে ব্যর্থ হবে না ?
জোশ

14

একটু দেরি করে ফেলেছি, কিন্তু আমি সঠিক একই প্রয়োজন ছিল, এবং আমি এটা সুরাহা করার জন্য একটি ছোট গ্রন্থাগার গড়ে তুলেছি (সাধারণ বিপর্যস্ত সংক্রামক দ্বারা, SEGV, SIBGUS, ইত্যাদি) ভিতরে JNI কোড , এবং তাদের নিয়মিত দ্বারা প্রতিস্থাপন java.lang.Error ব্যতিক্রম । বোনাস, যদি ক্লায়েন্টটি অ্যান্ড্রয়েড> = এ চলছে 4.1.1, স্ট্যাক ট্রেস ক্র্যাশের সংশোধিত ব্যাকট্র্যাস এম্বেড করে (সম্পূর্ণ নেটিভ স্ট্যাক ট্রেসযুক্ত সিউডো-ট্রেস)। দুষ্টু ক্রাশ থেকে আপনি পুনরুদ্ধার করতে পারবেন না (যেমন, যদি আপনি বরাদ্দকারীকে দূষিত করেন, উদাহরণস্বরূপ) তবে কমপক্ষে এটি আপনাকে বেশিরভাগের থেকে পুনরুদ্ধার করতে দেয় । (দয়া করে সাফল্য এবং ব্যর্থতার রিপোর্ট করুন, কোডটি একেবারে নতুন)

Https://github.com/xroche/coffeecatch এ আরও তথ্য (কোডটি BSD 2-Clauses লাইসেন্স )


6

FWIW , গুগল ব্রেকপ্যাড অ্যান্ড্রয়েডে দুর্দান্ত কাজ করে। আমি পোর্টিংয়ের কাজটি করেছি এবং আমরা এটি ফায়ারফক্স মোবাইলের অংশ হিসাবে শিপিং করছি। এটির জন্য একটি সামান্য সেটআপ প্রয়োজন, যেহেতু এটি আপনাকে ক্লায়েন্ট-সাইডে স্ট্যাকের চিহ্নগুলি দেয় না, তবে আপনাকে কাঁচা স্ট্যাক মেমরি প্রেরণ করে এবং স্ট্যাক ওয়াকিং সার্ভার-সাইডটি করে (যাতে আপনাকে আপনার অ্যাপ্লিকেশন দিয়ে ডিবাগ প্রতীকগুলি প্রেরণ করতে হবে না) )।


4
একেবারে নিখোঁজ ডকুমেন্টেশন বিবেচনা করে ব্রেকপ্যাড কনফিগার করা প্রায় অসম্ভব
শেডার

এটি সত্যিই এত কঠিন নয়, এবং প্রকল্প উইকিতে প্রচুর ডকুমেন্টেশন রয়েছে। প্রকৃতপক্ষে, অ্যান্ড্রয়েডের জন্য এখন একটি এনডিকে বিল্ড মেকফিল রয়েছে এবং এটি ব্যবহার করা অত্যন্ত সহজ হওয়া উচিত: Code.google.com/p/google-breakpad/source/browse/trunk/…
টেড মেল্কজারেক

আপনার অ্যান্ড্রয়েডের জন্য ডিবাগ প্রতীক ফাইলগুলি প্রিপ্রোসেস করে এমন মডিউলও সংকলন করতে হবে এবং আপনি কেবল এটি লিনাক্সে সংকলন করতে পারেন। আপনি যখন কোনও ম্যাকতে সংকলন করেন - এটি কেবল ম্যাক / আইওএস ডিএসএম প্রিপ্রসেসর তৈরি করে।
শেডার

5

আমার সীমিত অভিজ্ঞতায় (অ-অ্যান্ড্রয়েড), আপনার জাভা কোডটিতে নিয়ন্ত্রণ ফিরে আসার আগে জেএনআই কোডে সিগএসইজিভি সাধারণত জেভিএমকে ক্রাশ করবে। আমি অস্পষ্টভাবে কিছু অ-সান জেভিএম সম্পর্কে শুনছিলাম যা আপনাকে সিগসাইজিভি ধরতে দেয় তবে এএফএআইসিআর আপনি এটি করতে সক্ষম হবেন আশা করতে পারেন না।

আপনি এগুলিকে সি-তে ধরার চেষ্টা করতে পারেন (সিগিটিশন (২) দেখুন) যদিও কোনও প্রক্রিয়াটির চলমান আচরণ আনুষ্ঠানিকভাবে সংজ্ঞায়িত হওয়ায় আপনি একটি সিএসইএসজিভি (বা সিগফাইপি বা সিগিল) হ্যান্ডলারের পরে খুব সামান্য কাজ করতে পারেন।


ঠিক আছে, "একটি সিএফএফপিই, সিগিল বা সিগসাইজিভি সংকেত উপেক্ষা করার পরে [আচরণ] অপরিজ্ঞাত করা হয়েছে যা কিল (2) বা উত্থাপন (3)" দ্বারা উত্পন্ন হয়নি, তবে এ জাতীয় সংকেত ধরার সময় অগত্যা নয়। বর্তমান পরিকল্পনাটি সি সিগন্যাল হ্যান্ডলারের চেষ্টা করে যা জাভাতে ফিরে কল করে এবং কোনওভাবে প্রক্রিয়াটি না শেষ করে থ্রেডটি বন্ধ করে দেয়। এটি সম্ভবও নাও হতে পারে। :-)
ক্রিস বয়েল

4
সি ব্যাকট্রেস নির্দেশাবলী: stackoverflow.com/questions/76822/…
ক্রিস বয়েল

4
... ব্যতীত আমি () ব্যবহার করতে পারি না, কারণ অ্যান্ড্রয়েড গ্লিবিসি ব্যবহার করে না, এটি বায়োনিক ব্যবহার করে। :-( জড়িত কিছু _Unwind_Backtraceথেকে unwind.hপরিবর্তে প্রয়োজন হবে।
ক্রিস বয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.