আমি আমার সি ++ অ্যাপ্লিকেশনটিতে একটি নির্দিষ্ট স্থানে একটি কোর ডাম্প জোর করতে চাই।
আমি জানি আমি এ জাতীয় কিছু করে এটি করতে পারি:
int * crash = NULL;
*crash = 1;
তবে আমি জানতে চাই যে কোনও ক্লিনার উপায় আছে কিনা?
আমি লিনাক্স ব্যবহার করছি।
আমি আমার সি ++ অ্যাপ্লিকেশনটিতে একটি নির্দিষ্ট স্থানে একটি কোর ডাম্প জোর করতে চাই।
আমি জানি আমি এ জাতীয় কিছু করে এটি করতে পারি:
int * crash = NULL;
*crash = 1;
তবে আমি জানতে চাই যে কোনও ক্লিনার উপায় আছে কিনা?
আমি লিনাক্স ব্যবহার করছি।
উত্তর:
সিগন্যাল নম্বর SIGABRT
Linux ( লিনাক্সে) উত্থাপন করাই এটির একটি উপায় (যদিও মনে রাখবেন যে POSIX সমস্ত বাস্তবায়নে SIGABRT এর 6 প্রয়োজন হয় না তাই যদি আপনি SIGABRT
দ্রুতই ব্যতীত অন্য কোনও কিছু করেন তবে মানটি নিজেই ব্যবহার করতে পারেন 'নোংরা ডিবাগ কোড)।
#include <signal.h>
: : :
raise (SIGABRT);
কলিংয়ের abort()
ফলে একটি মূল ডাম্পের কারণ ঘটবে এবং আপনি কেবলমাত্র সন্তানের পরে কল করে আপনার প্রক্রিয়াটি বন্ধ না করে এটি করতে পারেন - বিশদর জন্য এই উত্তরটি দেখুন।fork()
abort()
ulimit -c unlimited
সুवेश প্রতাপ উত্তর থেকে প্রাপ্ত ইঙ্গিতটি , এই উত্তরের জন্য আমার অনেক সাহায্য করেছে।
কয়েক বছর আগে গুগল করডাম্পার লাইব্রেরি প্রকাশ করেছিল ।
ওভারভিউ
সোরডাম্পার লাইব্রেরিটি চলমান প্রোগ্রামের মূল ডাম্পগুলি তৈরি করতে - শেষ না করে অ্যাপ্লিকেশনগুলিতে সংকলন করা যেতে পারে। এটি একক এবং বহু-থ্রেডেড কোর ডাম্প উভয়ই সমর্থন করে, এমনকি কার্নেল স্থানীয়ভাবে বহু-থ্রেডযুক্ত কোর ফাইলগুলি সমর্থন করে না।
সিএসডাম্পার বিএসডি লাইসেন্সের শর্তাবলীতে বিতরণ করা হয়।
উদাহরণ
এটি কোনওভাবেই একটি সম্পূর্ণ উদাহরণ নয়; এটি সহজেই আপনাকে করডাম্পার এপিআই দেখতে দেখতে একটি অনুভূতি দেয়।
#include <google/coredumper.h> ... WriteCoreDump('core.myprogram'); /* Keep going, we generated a core file, * but we didn't crash. */
এটি আপনি যা চেয়েছিলেন তা নয়, তবে এটি আরও ভাল :)
তালিকাভুক্ত হিসাবে সংকেত র 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
setrlimit(RLIMIT_CORE, &core_limits);
মাধ্যমে উপলব্ধ ব্যবহার করতে পারেন #include <sys/resource.h>
। আপনি টাইপের একটি স্ট্রাক্ট তৈরি করুন rlimit
এবং তারপরে rlim_cur
এবং rlim_max
সদস্যদের সেট করুন ।
#include <stdlib.h> // C
//#include <cstdlib> // C++
void core_dump(void)
{
abort();
}
abort()
সরাসরি কল করবেন না?
দাওয়াত
abort();
সম্পর্কিত, কখনও কখনও আপনি একটি আসল কোর ডাম্প ব্যাক ট্রেস চান, এবং প্রোগ্রামটি চালিয়ে যেতে অনুমতি দিন: গ্লিবসি ব্যাকট্রেস () এবং ব্যাকট্র্যাস_সাইমবোলস () ফাংশনগুলি দেখুন: http://www.gnu.org/s/libc/ ম্যানুয়াল / এইচটিএমএল_নোড / ব্যাকট্রেসস html
কোর ডাম্প তৈরির অন্য উপায়:
$ bash
$ kill -s SIGSEGV $$
কেবলমাত্র ব্যাশের একটি নতুন উদাহরণ তৈরি করুন এবং নির্দিষ্ট সংকেত দিয়ে এটি হত্যা করুন। $$
শেলের PID, হয়। অন্যথায় আপনি আপনার বর্তমান বাশটিকে হত্যা করছেন এবং লগ আউট হয়ে যাবে, টার্মিনাল বন্ধ বা সংযোগ বিচ্ছিন্ন।
$ bash
$ kill -s SIGABRT $$
$ bash
$ kill -s SIGFPE $$
bash -c 'kill -SIGSEGV $$'
।
সংকেত প্রেরণের জন্য আপনি কিল (2) ব্যবহার করতে পারেন ।
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
সুতরাং,
kill(getpid(), SIGSEGV);
কখনও কখনও এটির মতো কিছু করা উপযুক্ত হতে পারে:
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
এই সহজ পদ্ধতির সাথে একটি সমস্যা হ'ল কেবল একটি থ্রেড কর্ডড করা হবে।
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("\n");
printf("Process is aborting\n");
abort();
printf("Control not reaching here\n");
return 0;
}
আপনি যেখানেই চান এই পদ্ধতির ব্যবহার করুন :)
#include <assert.h>
.
.
.
assert(!"this should not happen");