কীভাবে প্রোগ্রামিয়ালি সি / সি ++ এ কোর ডাম্প তৈরি করতে হয়


93

আমি আমার সি ++ অ্যাপ্লিকেশনটিতে একটি নির্দিষ্ট স্থানে একটি কোর ডাম্প জোর করতে চাই।

আমি জানি আমি এ জাতীয় কিছু করে এটি করতে পারি:

int * crash = NULL;
*crash = 1;

তবে আমি জানতে চাই যে কোনও ক্লিনার উপায় আছে কিনা?

আমি লিনাক্স ব্যবহার করছি।


18
কোর ডাম্প যাওয়ার একটি "ক্লিনার" উপায়? .... ভাল এক;)
ওজে।

5
এটা অনেক সুন্দর. এখনও একটি বুলিয়ান ব্যবহার করুন (সি এনামে?) ... যদি ( ক্র্যাশ = সত্য) {/ ওএইচ শি ... ... /}
এপি-ইনগো

4
বিটিডাব্লু, এই পদ্ধতিটি সমস্ত ইউনিক্সে কাজ করে না। HPUX, এক জন্য, আপনাকে দায়মুক্তি দিয়ে NULL পড়তে এবং লেখার অনুমতি দেয় (ধন্যবাদ, এটি কনফিগারযোগ্য)
paxdiablo

4
আমি কেবল 3 বা 4 দুর্দান্ত নতুন জিনিসের মতো শিখেছি। ধন্যবাদ
ট্রেভর বয়েড স্মিথ

@ প্যাক্স জেনেরিক উপায় খুঁজে পাওয়ার আরও কারণ
দেখায়

উত্তর:


78

সিগন্যাল নম্বর SIGABRTLinux ( লিনাক্সে) উত্থাপন করাই এটির একটি উপায় (যদিও মনে রাখবেন যে POSIX সমস্ত বাস্তবায়নে SIGABRT এর 6 প্রয়োজন হয় না তাই যদি আপনি SIGABRTদ্রুতই ব্যতীত অন্য কোনও কিছু করেন তবে মানটি নিজেই ব্যবহার করতে পারেন 'নোংরা ডিবাগ কোড)।

#include <signal.h>
: : :
raise (SIGABRT);

কলিংয়ের abort()ফলে একটি মূল ডাম্পের কারণ ঘটবে এবং আপনি কেবলমাত্র সন্তানের পরে কল করে আপনার প্রক্রিয়াটি বন্ধ না করে এটি করতে পারেন - বিশদর জন্য এই উত্তরটি দেখুন।fork()abort()


7
সিগ্যাবআরটি 6 নম্বর সংকেত হওয়ার প্রয়োজন নেই (যদিও এটি প্রায়শই - এবং বিশেষত লিনাক্সে রয়েছে)।
জোনাথন লেফলার

4
না, আপনি ঠিক বলেছেন, এটি নয় তবে আমি ডিবাগ কোডের সঠিকতা সম্পর্কে খুব বেশি চিন্তা করার প্রবণতা রাখি না। যদি এটি বন্যের মধ্যে পালিয়ে যায় তবে আমার কোডের পরিষ্কার পরিচ্ছন্নতা আমার উদ্বেগের মধ্যে সবচেয়ে কম :-)
প্যাক্সিডিয়াবল

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

4
দুঃখিত, এআরএম এ একই জিনিস এমনকি উত্থাপিত (SIGABRT) দিয়েও ঘটে। সুতরাং একটি ট্রেসযোগ্য কোর ফাইল তৈরি করার একমাত্র উপায় হ'ল কিল (getpid (), SIGABRT)
আলেকজান্ডার আমেলকিন

ulimit -c unlimitedসুवेश প্রতাপ উত্তর থেকে প্রাপ্ত ইঙ্গিতটি , এই উত্তরের জন্য আমার অনেক সাহায্য করেছে।
বোরিস ডাপ্পেন

75

কয়েক বছর আগে গুগল করডাম্পার লাইব্রেরি প্রকাশ করেছিল ।

ওভারভিউ

সোরডাম্পার লাইব্রেরিটি চলমান প্রোগ্রামের মূল ডাম্পগুলি তৈরি করতে - শেষ না করে অ্যাপ্লিকেশনগুলিতে সংকলন করা যেতে পারে। এটি একক এবং বহু-থ্রেডেড কোর ডাম্প উভয়ই সমর্থন করে, এমনকি কার্নেল স্থানীয়ভাবে বহু-থ্রেডযুক্ত কোর ফাইলগুলি সমর্থন করে না।

সিএসডাম্পার বিএসডি লাইসেন্সের শর্তাবলীতে বিতরণ করা হয়।

উদাহরণ

এটি কোনওভাবেই একটি সম্পূর্ণ উদাহরণ নয়; এটি সহজেই আপনাকে করডাম্পার এপিআই দেখতে দেখতে একটি অনুভূতি দেয়।

#include <google/coredumper.h>
...
WriteCoreDump('core.myprogram');
/* Keep going, we generated a core file,
 * but we didn't crash.
 */

এটি আপনি যা চেয়েছিলেন তা নয়, তবে এটি আরও ভাল :)


4
আমি এই উত্তরটি পেরিয়ে যখন শুরুতে আমি বেশ উত্তেজিত ছিলাম। তবে কোর ডাম্পারটি দেখতে এখন বেশ পুরানো এবং ক্ষয়িষ্ণু দেখাচ্ছে। : এমনকি ইঙ্গিত এটি সমসাময়িক লিনাক্স আর কাজ করে না কার্নেলের এর stackoverflow.com/questions/38314020/...
jefe2000

37

তালিকাভুক্ত হিসাবে সংকেত র manpage , 'কোর' হিসেবে তালিকাভুক্ত কর্ম সঙ্গে কোনো সংকেত একটি কোর ডাম্প বাধ্য করা হবে। কয়েকটি উদাহরণ হ'ল:

SIGQUIT       3       Core    Quit from keyboard
SIGILL        4       Core    Illegal Instruction
SIGABRT       6       Core    Abort signal from abort(3)
SIGFPE        8       Core    Floating point exception
SIGSEGV      11       Core    Invalid memory reference

আপনি কোর ডাম্প সক্ষম করেছেন তা নিশ্চিত করুন:

ulimit -c unlimited

ধন্যবাদ, ulimit -c unlimitedসহায়তায় মূল ডাম্পগুলি সক্ষম করার বিষয়ে আপনার মন্তব্য ।

আপনি কোডের মধ্যে থেকে কীভাবে উলিমিট সেট করবেন? @ ks1322
করণ জোশাইর

@ কারানজোইশার এটি সম্ভবত নিজের কাছে অন্য একটি প্রশ্নের পক্ষে মূল্যবান তবে সংক্ষেপে আপনি এর setrlimit(RLIMIT_CORE, &core_limits);মাধ্যমে উপলব্ধ ব্যবহার করতে পারেন #include <sys/resource.h>। আপনি টাইপের একটি স্ট্রাক্ট তৈরি করুন rlimitএবং তারপরে rlim_curএবং rlim_maxসদস্যদের সেট করুন ।
ব্রেন্ট লেখার কোড


11

দাওয়াত

abort();

সম্পর্কিত, কখনও কখনও আপনি একটি আসল কোর ডাম্প ব্যাক ট্রেস চান, এবং প্রোগ্রামটি চালিয়ে যেতে অনুমতি দিন: গ্লিবসি ব্যাকট্রেস () এবং ব্যাকট্র্যাস_সাইমবোলস () ফাংশনগুলি দেখুন: http://www.gnu.org/s/libc/ ম্যানুয়াল / এইচটিএমএল_নোড / ব্যাকট্রেসস html


6

কোর ডাম্প তৈরির অন্য উপায়:

$ bash
$ kill -s SIGSEGV $$

কেবলমাত্র ব্যাশের একটি নতুন উদাহরণ তৈরি করুন এবং নির্দিষ্ট সংকেত দিয়ে এটি হত্যা করুন। $$শেলের PID, হয়। অন্যথায় আপনি আপনার বর্তমান বাশটিকে হত্যা করছেন এবং লগ আউট হয়ে যাবে, টার্মিনাল বন্ধ বা সংযোগ বিচ্ছিন্ন।

$ bash 
$ kill -s SIGABRT $$
$ bash
$ kill -s SIGFPE $$

খুব সহজ এবং দরকারী!
ফিরো

4
আমি খুব যে এক মত. এমনকি এটি সহজ করা যেতে পারে bash -c 'kill -SIGSEGV $$'
খ্রিস্টান ক্রাউস


2

কখনও কখনও এটির মতো কিছু করা উপযুক্ত হতে পারে:

int st = 0;
pid_t p = fork();

if (!p) {
    signal(SIGABRT, SIG_DFL);
    abort(); // having the coredump of the exact copy of the calling thread
} else {
    waitpid(p, &st, 0); // rip the zombie
}

// here the original process continues to live

এই সহজ পদ্ধতির সাথে একটি সমস্যা হ'ল কেবল একটি থ্রেড কর্ডড করা হবে।


1
 #include <stdio.h>
 #include <stdlib.h>
 int main()
 {
   printf("\n");
   printf("Process is aborting\n");
   abort();
   printf("Control not reaching here\n");
   return 0;
 }

আপনি যেখানেই চান এই পদ্ধতির ব্যবহার করুন :)


0
#include <assert.h>
.
.
.
     assert(!"this should not happen");

সম্ভবত NDEBUG এর সাথে গোছানো দরকার তাই অন্যান্য দৃ as়তা না থাকলেও এই বিশেষ দাবিটি সক্রিয় থাকে।
Rhys Ulerich
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.