আমার লিনাক্সে একটি প্রক্রিয়া রয়েছে যা সেগমেন্টেশন ত্রুটি পাচ্ছে। এটি ব্যর্থ হলে আমি কীভাবে এটি একটি কোর ডাম্প তৈরি করতে বলতে পারি?
আমার লিনাক্সে একটি প্রক্রিয়া রয়েছে যা সেগমেন্টেশন ত্রুটি পাচ্ছে। এটি ব্যর্থ হলে আমি কীভাবে এটি একটি কোর ডাম্প তৈরি করতে বলতে পারি?
উত্তর:
এটি আপনি কোন শেল ব্যবহার করছেন তার উপর নির্ভর করে। আপনি যদি ব্যাশ ব্যবহার করছেন তবে ulimit কমান্ড প্রোগ্রামের প্রয়োগের সাথে সম্পর্কিত কয়েকটি সেটিংস নিয়ন্ত্রণ করে, যেমন আপনার কোর ডাম্প করা উচিত। যদি আপনি টাইপ করেন
ulimit -c unlimited
তারপরে এটি বাশকে বলবে যে এর প্রোগ্রামগুলি যে কোনও আকারের কোর ডাম্প করতে পারে। আপনি চাইলে আনলিমিটেডের পরিবর্তে 52 এম এর মতো একটি আকার নির্দিষ্ট করতে পারেন, তবে বাস্তবে এটি প্রয়োজনীয় হবে না কারণ মূল ফাইলগুলির আকার সম্ভবত আপনার পক্ষে কোনও সমস্যা হয়ে উঠবে না।
Tcsh এ, আপনি টাইপ করবেন
limit coredumpsize unlimited
এখানে যেমন জিজ্ঞাসা করা হচ্ছে আসল প্রশ্নটি উপরে বর্ণিত তা হ'ল কোনও সিস্টেমে কোর ডাম্পগুলি সক্ষম করা যায় যেখানে তারা সক্ষম হয় না। এই প্রশ্নের উত্তর এখানে দেওয়া আছে।
আপনি যদি এখানে ঝুলন্ত প্রক্রিয়াটির জন্য একটি মূল ডাম্প কীভাবে তৈরি করবেন তা শিখতে আশা করে এখানে এসেছেন, উত্তরটি
gcore <pid>
আপনার সিস্টেমে যদি gcore পাওয়া না যায়
kill -ABRT <pid>
কিল-এসইজিভি ব্যবহার করবেন না কারণ এটি প্রায়শই একটি সিগন্যাল হ্যান্ডলারকে আটকানো প্রক্রিয়া সনাক্তকরণকে আরও শক্ত করে তোলে
-ABRT
সেগফোল্টের চেয়ে -SEGV
একটি গর্ভপাত অধিকতর পুনরুদ্ধারযোগ্য হওয়ার সম্ভাবনা বেশি হওয়ার চেয়ে সিগন্যাল হ্যান্ডলারের চেয়ে অনেক বেশি সম্ভাবনা রয়েছে। (যদি আপনি কোনও সেগফল্ট পরিচালনা করেন তবে সাধারণত আপনার হ্যান্ডলারটি প্রস্থান করার সাথে সাথে এটি আবার ট্রিগার হয়ে উঠবে dump) কোর ডাম্প তৈরির জন্য সিগন্যালের আরও ভাল পছন্দ -QUIT
।
কোর ডাম্পগুলি কোথায় উত্পন্ন হয় তা পরীক্ষা করতে, চালনা করুন:
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/
। তবে এটি স্থিতিশীল প্রকাশে ডিফল্টরূপে অক্ষম থাকে।
আরও তথ্যের জন্য, দয়া করে চেক করুন: উবুন্টুতে আমি কোথায় মূল ডাম্প পাই? ।
ম্যাকোসের জন্য দেখুন: ম্যাক ওএস এক্সে কোর ডাম্পগুলি কীভাবে উত্পন্ন করা যায়?
আমি শেষে যা করেছি তা ক্র্যাশ হওয়ার আগে প্রক্রিয়াটির সাথে জিডিবি সংযুক্ত ছিল এবং তারপরে যখন সেগফল্ট পেয়েছে তখন আমি generate-core-file
কমান্ডটি কার্যকর করেছি । একটি বাধ্যতামূলক প্রজন্ম একটি কোর ডাম্প।
ge
)
ulimit -c
করে রেখেছি unlimited
, তবে মূল ফাইলটি তৈরি করা হয়নি, generate-core-file
জিডিবি সেশনে ফাইলটি মূল ফাইলটি তৈরি করবে, ধন্যবাদ।
হতে পারে আপনি এইভাবে এটি করতে পারেন, এই প্রোগ্রামটি সেগমেন্টেশন ত্রুটিটি কীভাবে ফাঁদে ফেলা যায় এবং এটি একটি ডিবাগারের কাছে শেল আউট করা যায় (এটি মূল কোডটি যার অধীনে ব্যবহৃত হয় 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 */
}
এই ব্লগে এখানে বর্ণিত কোরটি ডাম্প করার জন্য আপনাকে অতিরিক্তভাবে একটি পরামিতি যুক্ত করতে হবে ।
কোর ডাম্পের প্রজন্মকে প্রভাবিত করতে পারে এমন আরও অনেক জিনিস রয়েছে। আমি এগুলির মুখোমুখি হয়েছি:
/proc/sys/kernel/core_pattern
। /proc/sys/fs/suid_dumpable
কোর উত্পন্ন হতে পারে।ম্যান পৃষ্ঠায় বর্ণিত প্রজন্মকে রোধ করতে পারে এমন আরও অনেক পরিস্থিতি রয়েছে - চেষ্টা করুন man core
।
কোর ডাম সক্রিয় করার জন্য নিম্নলিখিতটি করুন:
ইন /etc/profile
মন্তব্য লাইন:
# ulimit -S -c 0 > /dev/null 2>&1
ইন /etc/security/limits.conf
মন্তব্য লাইন আউট:
* soft core 0
সেমিডি এক্সিকিউট করুন 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
#
কোরফাইলটি লিখিত হয়েছে কিনা তা পরীক্ষা করতে আপনি সেমিডডির সাথে সম্পর্কিত প্রক্রিয়াটি মেরে ফেলতে পারেন kill -s SEGV <PID>
(প্রয়োজন হবে না, কেবল কোনও কোর ফাইল লিখিত না হলে এটি চেক হিসাবে ব্যবহার করা যেতে পারে):
# kill -s SEGV <PID>
একবার কোরফাইলটি লিখিত হয়ে গেলে সংশ্লিষ্ট ফাইলগুলিতে আবার করডাম্প সেটিংস নিষ্ক্রিয় করতে নিশ্চিত করুন (১/২./৩।)!
উবুন্টু 14.04 এর জন্য
কোর ডাম্প সক্ষম পরীক্ষা করুন:
ulimit -a
লাইনগুলির একটি হতে হবে:
core file size (blocks, -c) unlimited
যদি না :
gedit ~/.bashrc
এবং ulimit -c unlimited
ফাইলের শেষে যুক্ত করুন এবং টার্মিনালটি পুনরায় রান করুন।
ডিবাগ তথ্য দিয়ে আপনার অ্যাপ্লিকেশন তৈরি করুন:
মেকফাইলে -O0 -g
অ্যাপ্লিকেশন চালান যা কোর ডাম্প তৈরি করে ('कोर' নামযুক্ত কোর ডাম্প ফাইলটি প্রয়োগ_নাম ফাইলের কাছে তৈরি করা উচিত):
./application_name
জিডিবির অধীনে চালান:
gdb application_name core
ulimit -c unlimited
অস্থায়ী সমাধানের জন্য কেবল টার্মিনাল স্থাপন করতে পারেন , কারণ শুধুমাত্র সম্পাদনা ~/.bashrc
করার ফলে পরিবর্তনগুলি কার্যকর করতে টার্মিনাল রিসর্টের প্রয়োজন হয়।
ডিফল্টরূপে আপনি একটি মূল ফাইল পাবেন। প্রক্রিয়াটির বর্তমান ডিরেক্টরি লেখার যোগ্য কিনা তা পরীক্ষা করে দেখুন বা কোনও মূল ফাইল তৈরি করা হবে না।
সিস্টেম কল ব্যবহার করে মূল ডাম্প চালু করা আরও ভাল 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
হয়েছে, কমান্ড লাইনের পরিবেশে প্রয়োজন নেই এবং তারপরে অ্যাপ্লিকেশনটি পুনরায় চালু করতে হবে।
ulimit -c unlimited
। এছাড়াও আপনি মার্কো সংজ্ঞা দিয়ে সংকলন করতে পারেন, enable_core_dump
রিলিজ করার সময় ম্যাক্রোটি সংজ্ঞায়িত না করা হলে অ্যাপ্লিকেশনটিতে প্রতীক অন্তর্ভুক্ত থাকবে না এবং আপনি ডিবাগ সংস্করণ সহ একটি কোর ডাম্প প্রতিস্থাপন পাবেন।
এটি উল্লেখ করার মতো যে যদি আপনার সিস্টেমেড সেটআপ থাকে তবে জিনিসগুলি কিছুটা আলাদা। 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
উবুন্টু 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
মান স্বয়ংক্রিয়ভাবে পরিবর্তিত পেতে পারে যখন আপনি ওয়েবের অন্যান্য উত্তর চেষ্টা করছেন। আপনার মূল ডাম্প তৈরি করার সময় এটি নিয়মিত পরীক্ষা করে দেখুন।তথ্যসূত্র: