কীভাবে বিভাগের ত্রুটিতে লিনাক্সে একটি কোর ডাম্প তৈরি করা যায়?


217

আমার লিনাক্সে একটি প্রক্রিয়া রয়েছে যা সেগমেন্টেশন ত্রুটি পাচ্ছে। এটি ব্যর্থ হলে আমি কীভাবে এটি একটি কোর ডাম্প তৈরি করতে বলতে পারি?


উত্তর:


249

এটি আপনি কোন শেল ব্যবহার করছেন তার উপর নির্ভর করে। আপনি যদি ব্যাশ ব্যবহার করছেন তবে ulimit কমান্ড প্রোগ্রামের প্রয়োগের সাথে সম্পর্কিত কয়েকটি সেটিংস নিয়ন্ত্রণ করে, যেমন আপনার কোর ডাম্প করা উচিত। যদি আপনি টাইপ করেন

ulimit -c unlimited

তারপরে এটি বাশকে বলবে যে এর প্রোগ্রামগুলি যে কোনও আকারের কোর ডাম্প করতে পারে। আপনি চাইলে আনলিমিটেডের পরিবর্তে 52 এম এর মতো একটি আকার নির্দিষ্ট করতে পারেন, তবে বাস্তবে এটি প্রয়োজনীয় হবে না কারণ মূল ফাইলগুলির আকার সম্ভবত আপনার পক্ষে কোনও সমস্যা হয়ে উঠবে না।

Tcsh এ, আপনি টাইপ করবেন

limit coredumpsize unlimited

21
@lzprgmr: স্পষ্ট করার জন্য: ডিফল্টরূপে কোর ডাম্পগুলি উত্পন্ন না হওয়ার কারণটি হ'ল সীমাটি সেট করা হয়নি এবং / অথবা 0 তে সেট করা হয়েছে, যা কোরটিকে ডাম্প হতে বাধা দেয়। সীমাহীন সীমা নির্ধারণ করে আমরা গ্যারান্টি দিচ্ছি যে কোর ডাম্পগুলি সর্বদা উত্পন্ন করা যায়।
এলি কোর্টরাইট

6
এই লিঙ্কটি আরও গভীরতর হয় এবং লিনাক্সের মূল ডাম্পগুলি তৈরি করতে আরও কিছু বিকল্প দেয়। একমাত্র অপূর্ণতা হ'ল কিছু কমান্ড / সেটিংস অব্যক্ত রেখে গেছে।
সালসা

6
4.1.2 বাশ-এ (1) - 52 এম এর মতো রিলিজ সীমা নির্দিষ্ট করা যায় না, যার ফলে একটি অবৈধ সংখ্যা ত্রুটি বার্তা আসে। ম্যান পৃষ্ঠাটি বলে যে "মানগুলি 1024-বাইট ইনক্রিমেন্টে থাকে"।
এএন

4
ঠিক আছে আমার একটি "ছোট" ওপেনজিএল প্রকল্প ছিল যা একবার কিছু অদ্ভুত কাজ করেছিল এবং এক্স-সার্ভারের ক্রাশ ঘটায়। আমি যখন আবার লগইন করলাম তখন আমি দেখতে পেলাম একটি ছোট্ট 17 গিগাবাইট কোর ফাইল (25 জিবি পার্টিশনে)। মূল ফাইলটির আকার সীমাবদ্ধ রাখার জন্য এটি অবশ্যই একটি ভাল ধারণা :)
আইসকুল

1
@ পোলারিস ইউজার: আপনি যদি নিশ্চিত করতে চান যে আপনার পার্টিশনটি খাওয়া না পেয়েছে তবে আমি 1 গিগের মতো কিছু সীমা নির্ধারণ করার পরামর্শ দিচ্ছি। যে কোনও যুক্তিসঙ্গত কোর ডাম্প হ্যান্ডেল করার জন্য এটি যথেষ্ট পরিমাণে হওয়া উচিত, যখন আপনার অবশিষ্ট হার্ড ড্রাইভের সমস্ত জায়গাই ব্যবহার করার হুমকি না দেওয়া হয়।
এলি কোর্টরাইট

60

এখানে যেমন জিজ্ঞাসা করা হচ্ছে আসল প্রশ্নটি উপরে বর্ণিত তা হ'ল কোনও সিস্টেমে কোর ডাম্পগুলি সক্ষম করা যায় যেখানে তারা সক্ষম হয় না। এই প্রশ্নের উত্তর এখানে দেওয়া আছে।

আপনি যদি এখানে ঝুলন্ত প্রক্রিয়াটির জন্য একটি মূল ডাম্প কীভাবে তৈরি করবেন তা শিখতে আশা করে এখানে এসেছেন, উত্তরটি

gcore <pid>

আপনার সিস্টেমে যদি gcore পাওয়া না যায়

kill -ABRT <pid>

কিল-এসইজিভি ব্যবহার করবেন না কারণ এটি প্রায়শই একটি সিগন্যাল হ্যান্ডলারকে আটকানো প্রক্রিয়া সনাক্তকরণকে আরও শক্ত করে তোলে


আমি মনে করি এটি -ABRTসেগফোল্টের চেয়ে -SEGVএকটি গর্ভপাত অধিকতর পুনরুদ্ধারযোগ্য হওয়ার সম্ভাবনা বেশি হওয়ার চেয়ে সিগন্যাল হ্যান্ডলারের চেয়ে অনেক বেশি সম্ভাবনা রয়েছে। (যদি আপনি কোনও সেগফল্ট পরিচালনা করেন তবে সাধারণত আপনার হ্যান্ডলারটি প্রস্থান করার সাথে সাথে এটি আবার ট্রিগার হয়ে উঠবে dump) কোর ডাম্প তৈরির জন্য সিগন্যালের আরও ভাল পছন্দ -QUIT
সেল্টিকমিনিস্ট্রেল

32

কোর ডাম্পগুলি কোথায় উত্পন্ন হয় তা পরীক্ষা করতে, চালনা করুন:

sysctl kernel.core_pattern

বা:

cat /proc/sys/kernel/core_pattern

%eপ্রক্রিয়া নাম এবং %tসিস্টেম সময় যেখানে । আপনি এটিকে পরিবর্তন করে /etc/sysctl.confএবং পুনরায় লোড করতে পারেন sysctl -p

কোর ফাইল (দ্বারা এটি পরীক্ষা: তৈরি হয়েছে না হলে sleep 10 &এবং killall -SIGSEGV sleep), চেক দ্বারা সীমা: ulimit -a

যদি আপনার মূল ফাইলের আকার সীমাবদ্ধ থাকে তবে চালান:

ulimit -c unlimited

এটি সীমাহীন করতে।

তারপরে আবার পরীক্ষা করুন, যদি কোর ডাম্পিং সফল হয় তবে নীচের মত বিভাগের ত্রুটি ইঙ্গিত দেওয়ার পরে আপনি "(কোর ডাম্পড)" দেখতে পাবেন:

বিভাগকরণ ত্রুটি: 11 (কোর ডাম্পড)

আরও দেখুন: কোর ডাম্পড - তবে মূল ফাইলটি কি বর্তমান ডিরেক্টরিতে নেই?


উবুন্টু

উবুন্টুতে কোর ডাম্পগুলি অ্যাপপোর্ট দ্বারা পরিচালিত হয় এবং এটিতে অবস্থিত হতে পারে /var/crash/। তবে এটি স্থিতিশীল প্রকাশে ডিফল্টরূপে অক্ষম থাকে।

আরও তথ্যের জন্য, দয়া করে চেক করুন: উবুন্টুতে আমি কোথায় মূল ডাম্প পাই?

ম্যাক অপারেটিং সিস্টেম

ম্যাকোসের জন্য দেখুন: ম্যাক ওএস এক্সে কোর ডাম্পগুলি কীভাবে উত্পন্ন করা যায়?


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

26

আমি শেষে যা করেছি তা ক্র্যাশ হওয়ার আগে প্রক্রিয়াটির সাথে জিডিবি সংযুক্ত ছিল এবং তারপরে যখন সেগফল্ট পেয়েছে তখন আমি generate-core-fileকমান্ডটি কার্যকর করেছি । একটি বাধ্যতামূলক প্রজন্ম একটি কোর ডাম্প।


আপনি কিভাবে প্রক্রিয়াটির সাথে জিডিবি সংযুক্ত করলেন?
চানি

6
Itত্বিক জি-র জবাব দেওয়ার জন্য, জিডিবিতে কোনও প্রক্রিয়া সংযুক্ত করতে, সরাসরি জিডিবি চালু করুন এবং 'সংযুক্তি <pid>' লিখুন যেখানে <পিড> আপনি যে প্রক্রিয়াটি সংযুক্ত করতে চান তার পিড নম্বর।
জিন-ডমিনিক ফ্রেটিনি

(সংক্ষেপে হিসাবে ge)
ব্যবহারকারী 202729

তাদের যদি নতুন প্রশ্ন থাকে তবে তাদের কোনও মন্তব্যে জিজ্ঞাসা না করে নতুন প্রশ্ন জিজ্ঞাসা করা উচিত ।
ব্যবহারকারী 202729

অদ্ভুত জিনিসটি আমি ইতিমধ্যে সেট ulimit -cকরে রেখেছি unlimited, তবে মূল ফাইলটি তৈরি করা হয়নি, generate-core-fileজিডিবি সেশনে ফাইলটি মূল ফাইলটি তৈরি করবে, ধন্যবাদ।
কোডিচান

19

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

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <stdarg.h>

static void signal_handler(int);
static void dumpstack(void);
static void cleanup(void);
void init_signals(void);
void panic(const char *, ...);

struct sigaction sigact;
char *progname;

int main(int argc, char **argv) {
    char *s;
    progname = *(argv);
    atexit(cleanup);
    init_signals();
    printf("About to seg fault by assigning zero to *s\n");
    *s = 0;
    sigemptyset(&sigact.sa_mask);
    return 0;
}

void init_signals(void) {
    sigact.sa_handler = signal_handler;
    sigemptyset(&sigact.sa_mask);
    sigact.sa_flags = 0;
    sigaction(SIGINT, &sigact, (struct sigaction *)NULL);

    sigaddset(&sigact.sa_mask, SIGSEGV);
    sigaction(SIGSEGV, &sigact, (struct sigaction *)NULL);

    sigaddset(&sigact.sa_mask, SIGBUS);
    sigaction(SIGBUS, &sigact, (struct sigaction *)NULL);

    sigaddset(&sigact.sa_mask, SIGQUIT);
    sigaction(SIGQUIT, &sigact, (struct sigaction *)NULL);

    sigaddset(&sigact.sa_mask, SIGHUP);
    sigaction(SIGHUP, &sigact, (struct sigaction *)NULL);

    sigaddset(&sigact.sa_mask, SIGKILL);
    sigaction(SIGKILL, &sigact, (struct sigaction *)NULL);
}

static void signal_handler(int sig) {
    if (sig == SIGHUP) panic("FATAL: Program hanged up\n");
    if (sig == SIGSEGV || sig == SIGBUS){
        dumpstack();
        panic("FATAL: %s Fault. Logged StackTrace\n", (sig == SIGSEGV) ? "Segmentation" : ((sig == SIGBUS) ? "Bus" : "Unknown"));
    }
    if (sig == SIGQUIT) panic("QUIT signal ended program\n");
    if (sig == SIGKILL) panic("KILL signal ended program\n");
    if (sig == SIGINT) ;
}

void panic(const char *fmt, ...) {
    char buf[50];
    va_list argptr;
    va_start(argptr, fmt);
    vsprintf(buf, fmt, argptr);
    va_end(argptr);
    fprintf(stderr, buf);
    exit(-1);
}

static void dumpstack(void) {
    /* Got this routine from http://www.whitefang.com/unix/faq_toc.html
    ** Section 6.5. Modified to redirect to file to prevent clutter
    */
    /* This needs to be changed... */
    char dbx[160];

    sprintf(dbx, "echo 'where\ndetach' | dbx -a %d > %s.dump", getpid(), progname);
    /* Change the dbx to gdb */

    system(dbx);
    return;
}

void cleanup(void) {
    sigemptyset(&sigact.sa_mask);
    /* Do any cleaning up chores here */
}

এই ব্লগে এখানে বর্ণিত কোরটি ডাম্প করার জন্য আপনাকে অতিরিক্তভাবে একটি পরামিতি যুক্ত করতে হবে ।


16

কোর ডাম্পের প্রজন্মকে প্রভাবিত করতে পারে এমন আরও অনেক জিনিস রয়েছে। আমি এগুলির মুখোমুখি হয়েছি:

  • ডাম্পের জন্য ডিরেক্টরি অবশ্যই লিখনযোগ্য হবে। ডিফল্টরূপে এটি প্রক্রিয়াটির বর্তমান ডিরেক্টরি, তবে সেটিংসে পরিবর্তন করা যেতে পারে /proc/sys/kernel/core_pattern
  • কিছু পরিস্থিতিতে, কার্নেলের মানটি /proc/sys/fs/suid_dumpableকোর উত্পন্ন হতে পারে।

ম্যান পৃষ্ঠায় বর্ণিত প্রজন্মকে রোধ করতে পারে এমন আরও অনেক পরিস্থিতি রয়েছে - চেষ্টা করুন man core


9

কোর ডাম সক্রিয় করার জন্য নিম্নলিখিতটি করুন:

  1. ইন /etc/profileমন্তব্য লাইন:

    # ulimit -S -c 0 > /dev/null 2>&1
  2. ইন /etc/security/limits.confমন্তব্য লাইন আউট:

    *               soft    core            0
  3. সেমিডি এক্সিকিউট করুন limit coredumpsize unlimitedএবং এটি সিএমডি দিয়ে পরীক্ষা করুন limit:

    # limit coredumpsize unlimited
    # limit
    cputime      unlimited
    filesize     unlimited
    datasize     unlimited
    stacksize    10240 kbytes
    coredumpsize unlimited
    memoryuse    unlimited
    vmemoryuse   unlimited
    descriptors  1024
    memorylocked 32 kbytes
    maxproc      528383
    #
  4. কোরফাইলটি লিখিত হয়েছে কিনা তা পরীক্ষা করতে আপনি সেমিডডির সাথে সম্পর্কিত প্রক্রিয়াটি মেরে ফেলতে পারেন kill -s SEGV <PID>(প্রয়োজন হবে না, কেবল কোনও কোর ফাইল লিখিত না হলে এটি চেক হিসাবে ব্যবহার করা যেতে পারে):

    # kill -s SEGV <PID>

একবার কোরফাইলটি লিখিত হয়ে গেলে সংশ্লিষ্ট ফাইলগুলিতে আবার করডাম্প সেটিংস নিষ্ক্রিয় করতে নিশ্চিত করুন (১/২./৩।)!


9

উবুন্টু 14.04 এর জন্য

  1. কোর ডাম্প সক্ষম পরীক্ষা করুন:

    ulimit -a
  2. লাইনগুলির একটি হতে হবে:

    core file size          (blocks, -c) unlimited
  3. যদি না :

    gedit ~/.bashrcএবং ulimit -c unlimitedফাইলের শেষে যুক্ত করুন এবং টার্মিনালটি পুনরায় রান করুন।

  4. ডিবাগ তথ্য দিয়ে আপনার অ্যাপ্লিকেশন তৈরি করুন:

    মেকফাইলে -O0 -g

  5. অ্যাপ্লিকেশন চালান যা কোর ডাম্প তৈরি করে ('कोर' নামযুক্ত কোর ডাম্প ফাইলটি প্রয়োগ_নাম ফাইলের কাছে তৈরি করা উচিত):

    ./application_name
  6. জিডিবির অধীনে চালান:

    gdb application_name core

পদক্ষেপ 3 এ, টার্মিনালটি কীভাবে 'পুনরায় চালাবেন'? আপনি কি রিবুট মানে?
নবীন

@ নবীন, কেবলমাত্র টার্মিনালটি বন্ধ করুন এবং একটি নতুন খুলুন, এছাড়াও মনে হয় আপনি ulimit -c unlimitedঅস্থায়ী সমাধানের জন্য কেবল টার্মিনাল স্থাপন করতে পারেন , কারণ শুধুমাত্র সম্পাদনা ~/.bashrcকরার ফলে পরিবর্তনগুলি কার্যকর করতে টার্মিনাল রিসর্টের প্রয়োজন হয়।
mrgloom

4

ডিফল্টরূপে আপনি একটি মূল ফাইল পাবেন। প্রক্রিয়াটির বর্তমান ডিরেক্টরি লেখার যোগ্য কিনা তা পরীক্ষা করে দেখুন বা কোনও মূল ফাইল তৈরি করা হবে না।


4
"প্রক্রিয়াটির বর্তমান ডিরেক্টরি" দ্বারা আপনি কী বোঝাচ্ছেন যে প্রক্রিয়াটি চালিত হয়েছিল সে সময় $ cwd? cat / abc> / usr / bin / cat def বিড়াল ক্র্যাশ করলে, বর্তমান ডিরেক্টরিটি question / abc বা / usr / bin প্রশ্নে আছে?
নাথান ফেলম্যান

5
~ / এবিসি। হুঁ, মন্তব্যগুলি দীর্ঘ 15 অক্ষর হতে হবে!
মার্ক হ্যারিসন

5
এসইজিভি-র সময় এটি বর্তমান ডিরেক্টরি হবে। এছাড়াও, প্রকৃত ব্যবহারকারী / গোষ্ঠীর চেয়ে আলাদা কার্যকর ব্যবহারকারী এবং / অথবা গোষ্ঠীর সাথে চলমান প্রক্রিয়াগুলি মূল ফাইলগুলি লিখবে না।
ড্যারন

2

সিস্টেম কল ব্যবহার করে মূল ডাম্প চালু করা আরও ভাল setrlimit

উদাহরণ:

#include <sys/resource.h>

bool enable_core_dump(){    
    struct rlimit corelim;

    corelim.rlim_cur = RLIM_INFINITY;
    corelim.rlim_max = RLIM_INFINITY;

    return (0 == setrlimit(RLIMIT_CORE, &corelim));
}

কেন যে ভাল?
নাথান ফেলম্যান

মূল ফাইল ক্র্যাশ হওয়ার পরে উত্পন্ন ulimit -c unlimitedহয়েছে, কমান্ড লাইনের পরিবেশে প্রয়োজন নেই এবং তারপরে অ্যাপ্লিকেশনটি পুনরায় চালু করতে হবে।
কেজবুক

যখনই এটি ক্র্যাশ হয় তখন আমি কোনও কোর ডাম্প চাই না, কেবল তখনই যখন কোনও ব্যবহারকারী আমাকে এটির বিকাশকারী হিসাবে যোগাযোগ করে। যদি এটি 100 বার ক্র্যাশ হয়ে যায়, তবে আমার কাছে দেখার জন্য 100 টি কোরিয়ার দরকার নেই don't
নাথান ফেলম্যান

থা ক্ষেত্রে, ব্যবহার ভাল ulimit -c unlimited। এছাড়াও আপনি মার্কো সংজ্ঞা দিয়ে সংকলন করতে পারেন, enable_core_dumpরিলিজ করার সময় ম্যাক্রোটি সংজ্ঞায়িত না করা হলে অ্যাপ্লিকেশনটিতে প্রতীক অন্তর্ভুক্ত থাকবে না এবং আপনি ডিবাগ সংস্করণ সহ একটি কোর ডাম্প প্রতিস্থাপন পাবেন।
কেজবুক

এমনকি এটি কোনও ম্যাক্রোর দ্বারা যোগ্যতা অর্জন করা হলেও, পুনরায় চালনার আগে শেলটিতে একটি কমান্ড চালানোর পরিবর্তে আমি একটি কোর ডাম্প উত্পন্ন করতে চাইলে আমাকে পুনরায় কম্পাইল করতে হবে।
নাথান ফেলম্যান

1

এটি উল্লেখ করার মতো যে যদি আপনার সিস্টেমেড সেটআপ থাকে তবে জিনিসগুলি কিছুটা আলাদা। core_patternসেটআপটিতে সাধারণত সিস্ট ফাইলের পাইপ করা হত, সিসিকটেল মানের মাধ্যমে systemd-coredump(8)। মূল ফাইলের আকারের রিলিমিটটি ইতিমধ্যে ইতিমধ্যে "সীমাহীন" হিসাবে কনফিগার করা হবে।

তারপরে কোর ডাম্পগুলি ব্যবহার করে পুনরুদ্ধার করা সম্ভব coredumpctl(1)

কোর ডাম্প ইত্যাদির স্টোরেজটি কনফিগার করে coredump.conf(5)। কোরডম্প্যাক্টল ম্যান পৃষ্ঠায় কীভাবে মূল ফাইলগুলি পাওয়া যায় তার উদাহরণ রয়েছে তবে সংক্ষেপে এটি দেখতে এটি দেখতে পাবেন:

মূল ফাইলটি সন্ধান করুন:

[vps@phoenix]~$ coredumpctl list test_me | tail -1
Sun 2019-01-20 11:17:33 CET   16163  1224  1224  11 present /home/vps/test_me

মূল ফাইলটি পান:

[vps@phoenix]~$ coredumpctl -o test_me.core dump 16163

0

উবুন্টু 19.04

অন্য সমস্ত উত্তর নিজেরাই আমাকে সাহায্য করেনি। কিন্তু নিম্নলিখিত যোগফল কাজ করেছে

~/.config/apport/settingsনিম্নলিখিত বিষয়বস্তু দিয়ে তৈরি করুন :

[main]
unpackaged=true

(এটি কাস্টম অ্যাপ্লিকেশনগুলির জন্য কোর ডাম্পগুলি লেখার অনুরোধ করে)

চেক করুন: ulimit -c। যদি এটি 0 আউটপুট করে তবে এটিকে ঠিক করুন

ulimit -c unlimited

পুনরায় আরম্ভের ক্ষেত্রে কেবল ক্ষেত্রে:

sudo systemctl restart apport

ক্র্যাশ ফাইলগুলি এখন লেখা আছে /var/crash/। তবে আপনি এগুলি জিডিবি দিয়ে ব্যবহার করতে পারবেন না । এগুলি জিডিবি দিয়ে ব্যবহার করতে, ব্যবহার করুন

apport-unpack <location_of_report> <target_directory>

আরো তথ্য:

  • কিছু উত্তর পরিবর্তনের পরামর্শ দেয় core_pattern। সচেতন থাকুন, সেই ফাইলটি পুনরায় চালু করার সময়ে অ্যাপোর্ট পরিষেবা দ্বারা ওভাররাইট হয়ে যেতে পারে।
  • সহজভাবে বন্ধ করা কাজটি করেনি
  • ulimit -cমান স্বয়ংক্রিয়ভাবে পরিবর্তিত পেতে পারে যখন আপনি ওয়েবের অন্যান্য উত্তর চেষ্টা করছেন। আপনার মূল ডাম্প তৈরি করার সময় এটি নিয়মিত পরীক্ষা করে দেখুন।

তথ্যসূত্র:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.