আমার জাভা ব্যাকগ্রাউন্ড রয়েছে এবং আমি জাভা থ্রেড ডাম্প পরিদর্শন করতে সিগন্যাল কুইট ব্যবহার করতে পছন্দ করি।
গোলাংকে কীভাবে সমস্ত গরোটিন স্ট্যাক ট্রেস মুদ্রণ করতে দেয়?
আমার জাভা ব্যাকগ্রাউন্ড রয়েছে এবং আমি জাভা থ্রেড ডাম্প পরিদর্শন করতে সিগন্যাল কুইট ব্যবহার করতে পছন্দ করি।
গোলাংকে কীভাবে সমস্ত গরোটিন স্ট্যাক ট্রেস মুদ্রণ করতে দেয়?
উত্তর:
বর্তমান গোরোটিনের জন্য স্ট্যাক ট্রেস প্রিন্ট করতে , PrintStack()
এখান থেকেruntime/debug
ব্যবহার করুন ।
প্রিন্টস্ট্যাক স্ট্যাক দ্বারা ফিরে স্ট্যাক ট্রেস মানক ত্রুটিতে মুদ্রণ।
উদাহরণ স্বরূপ:
import(
"runtime/debug"
)
...
debug.PrintStack()
জন্য স্ট্যাক ট্রেস মুদ্রণ করতে সব goroutines ব্যবহার Lookup
এবং WriteTo
থেকে runtime/pprof
।
func Lookup(name string) *Profile
// Lookup returns the profile with the given name,
// or nil if no such profile exists.
func (p *Profile) WriteTo(w io.Writer, debug int) error
// WriteTo writes a pprof-formatted snapshot of the profile to w.
// If a write to w returns an error, WriteTo returns that error.
// Otherwise, WriteTo returns nil.
প্রতিটি প্রোফাইলের একটি অনন্য নাম রয়েছে। কয়েকটি প্রোফাইল পূর্বনির্ধারিত:
গোরাউটিন - সমস্ত বর্তমান গরোটিনস হিপগুলির স্ট্যাক ট্রেস -
সমস্ত হ্যাপ বরাদ্দ
থ্রেডক্রিয়াটের একটি নমুনা - স্ট্যাক ট্রেস যা নতুন ওএস থ্রেড
ব্লক তৈরি করতে নেতৃত্ব দেয় - স্ট্যাক ট্রেসগুলি যা সিঙ্ক্রোনাইজেশন আদিমগুলিতে ব্লক করেছিল led
উদাহরণ স্বরূপ:
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
Stack
। "স্ট্যাকটি গোরোটিনের একটি ফর্ম্যাট স্ট্যাক ট্রেস দেয় যা এটি বলে। প্রার্থনা। "
runtime/pprof
ইন্টারমারনেটের উত্তরে উল্লিখিত প্যাকেজের জন্য একটি এইচটিটিপি ফ্রন্ট্যান্ড রয়েছে। নেট / এইচটিপি / পিআরপিফ প্যাকেজটি এইচটিটিপি হ্যান্ডলারটি নিবন্ধ করার জন্য আমদানি করুন /debug/pprof
:
import _ "net/http/pprof"
import _ "net/http"
আপনার যদি ইতিমধ্যে কোনও না থাকে তবে এইচটিটিপি শ্রোতা শুরু করুন:
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
তারপরে http://localhost:6060/debug/pprof
একটি মেনু বা http://localhost:6060/debug/pprof/goroutine?debug=2
পুরো গোরোটিন স্ট্যাক ডাম্পের জন্য একটি ব্রাউজারকে নির্দেশ করুন ।
আপনার চলমান কোড সম্পর্কে আপনি আরও শিখতে পারেন এমন আরও মজাদার জিনিস রয়েছে। উদাহরণ এবং আরও বিশদের জন্য ব্লগ পোস্টটি দেখুন: http://blog.golang.org/profiling-go-program
জাভা আচরণের সিকিওয়েটে স্ট্যাক-ডাম্পের নকল করতে তবে প্রোগ্রামটি এখনও চলছে:
go func() {
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGQUIT)
buf := make([]byte, 1<<20)
for {
<-sigs
stacklen := runtime.Stack(buf, true)
log.Printf("=== received SIGQUIT ===\n*** goroutine dump...\n%s\n*** end\n", buf[:stacklen])
}
}()
জাভা এর মতোই, জিগ প্রোগ্রামের স্ট্যাক ট্রেস এবং এর গোরোটাইনগুলি মুদ্রণের জন্য সিগুয়েট ব্যবহার করা যেতে পারে।
তবে একটি মূল পার্থক্য হ'ল ডিফল্টভাবে জাভা প্রোগ্রামগুলিতে SIGQUIT প্রেরণগুলি সেগুলি বন্ধ করে না, যখন গো প্রোগ্রামগুলি প্রস্থান করে।
বিদ্যমান প্রোগ্রামগুলির সমস্ত গরোটিনগুলির স্ট্যাক ট্রেস মুদ্রণের জন্য এই পদ্ধতির কোনও কোড পরিবর্তন দরকার।
পরিবেশ পরিবর্তনশীল GOTRACEBACK ( রানটাইম প্যাকেজের ডকুমেন্টেশন দেখুন ) উত্পন্ন আউটপুটটির পরিমাণ নিয়ন্ত্রণ করে। উদাহরণস্বরূপ, সমস্ত গরোটিনগুলি অন্তর্ভুক্ত করতে GOTRACEBACK = সব সেট করুন।
স্ট্যাক ট্রেসের মুদ্রণটি একটি অপ্রত্যাশিত রানটাইম শর্ত (আনহ্যান্ডলড সিগন্যাল) দ্বারা ট্রিগার করা হয়েছে, মূলত এই কমিটে নথিভুক্ত , এটি কমপক্ষে 1.1 থেকে পাওয়া থেকে এটি উপলব্ধ করে।
বিকল্পভাবে, যদি সোর্স কোডটি সংশোধন করা কোনও বিকল্প হয় তবে অন্যান্য উত্তর দেখুন।
নোট করুন যে একটি লিনাক্স টার্মিনালে, সিকুইটটি সুবিধামত কী সংমিশ্রণ Ctrl+ সহ প্রেরণ করা যায় \।
আপনি সমস্ত টাইমস স্টোরের স্ট্যাক ট্রেস পেতে রানটাইম.স্ট্যাক ব্যবহার করতে পারেন :
buf := make([]byte, 1<<16)
runtime.Stack(buf, true)
fmt.Printf("%s", buf)
ডকুমেন্টেশন থেকে:
func Stack(buf []byte, all bool) int
স্ট্যাক কলিং গোরোটিনের স্ট্যাক ট্রেসকে বুফে রূপ দেয় এবং বুফে লিখিত বাইটের সংখ্যা প্রদান করে। যদি সমস্ত সত্য হয়, স্ট্যাক ফর্ম্যাটগুলি বর্তমান গরোটিনের সন্ধানের পরে অন্য সমস্ত গরোটিনগুলির ট্রেসকে বুফে পরিণত করে।
string(buf)
এখানে করার দরকার নেই, fmt.Printf("%s", buf)
এবং fmt.Printf("%s", string(buf))
ঠিক একই জিনিসটি করুন ( fmt
প্যাকেজের জন্য ডকস দেখুন ); এখানে কেবল পার্থক্য হ'ল string
সংস্করণটি বাইটগুলি অনুলিপি করবেbuf
অযথা
CTRL + Press টিপুন
(আপনি যদি এটি কোনও টার্মিনালে চালনা করেন এবং কেবল আপনার প্রোগ্রামটি মেরে ফেলতে চান এবং রুটিনগুলি ডাম্প করতে পারেন)
আমি এই প্রশ্নটির মূল সিকোয়েন্সটি খুঁজছি। আমার প্রোগ্রামটি গো রুটিনগুলি ফাঁস হচ্ছে কিনা তা জানাতে কেবল একটি দ্রুত এবং সহজ উপায় চেয়েছিলেন :)
* এনআইএক্স সিস্টেমগুলিতে (ওএসএক্স সহ) একটি সিগন্যাল বাতিল প্রেরণ করুন SIGABRT
:
pkill -SIGABRT program_name
runtime.Stack()
আপনার স্ট্যাক ট্রেসের পরে খালি রেখাগুলির একগুচ্ছ মুদ্রণ এড়ানোর জন্য ফিরে আসা দৈর্ঘ্যটি ব্যবহার করা দরকার। নিম্নলিখিত পুনরুদ্ধার ফাংশন একটি দুর্দান্ত বিন্যাসিত ট্রেস ছাপায়:
if r := recover(); r != nil {
log.Printf("Internal error: %v", r))
buf := make([]byte, 1<<16)
stackSize := runtime.Stack(buf, true)
log.Printf("%s\n", string(buf[0:stackSize]))
}
ডিফল্টরূপে, সমস্ত জোরোটাইনগুলির স্ট্যাক ট্রেসগুলি ফেলে দিতে ^\
কীগুলি ( CTRL + \ ) টিপুন ।
অন্যথায়, আরও দানাদার নিয়ন্ত্রণের জন্য, আপনি ব্যবহার করতে পারেন panic
। Go 1.6+ এর মতো সহজ উপায় :
go func() {
s := make(chan os.Signal, 1)
signal.Notify(s, syscall.SIGQUIT)
<-s
panic("give me the stack")
}()
তারপরে, আপনার প্রোগ্রামটি এভাবে চালিত করুন:
# Press ^\ to dump the stack traces of all the user-created goroutines
$ GOTRACEBACK=all go run main.go
আপনি যদি গো রানটাইম গোরটাইনগুলি মুদ্রণ করতে চান তবে:
$ GOTRACEBACK=system go run main.go
এখানে সমস্ত গট্র্যাকব্যাক বিকল্প রয়েছে:
GOTRACEBACK=none
পুরোপুরি জোরোটাইন স্ট্যাকের চিহ্নগুলি বাদ দেয়।GOTRACEBACK=single
(ডিফল্ট) উপরে বর্ণিত হিসাবে আচরণ করে।GOTRACEBACK=all
সমস্ত ব্যবহারকারীর দ্বারা তৈরি goroutines জন্য স্ট্যাক ট্রেস যোগ করুন।GOTRACEBACK=system
এটি `` All '' এর মতো তবে রান-টাইম ফাংশনগুলির জন্য স্ট্যাক ফ্রেম যুক্ত করে এবং রান-টাইম দ্বারা অভ্যন্তরীণভাবে তৈরি গোরোটাইনগুলি দেখায়।GOTRACEBACK=crash
`` সিস্টেম '' এর মতো তবে অপারেটিং সিস্টেম-নির্দিষ্ট পদ্ধতিতে ক্রাশ হওয়ার পরিবর্তে প্রস্থান। উদাহরণস্বরূপ, ইউনিক্স সিস্টেমে ক্রাশটি SIGABRT
মূল ডাম্প ট্রিগার করতে উত্থাপন করে।কোনও অনাকাঙ্ক্ষিত আতঙ্ক বা অপ্রত্যাশিত রানটাইম শর্তের কারণে যখন কোনও গো প্রোগ্রাম ব্যর্থ হয় তখন GOTRACEBACK পরিবর্তনশীল আউটপুট পরিমাণ নিয়ন্ত্রণ করে controls
ডিফল্টরূপে, একটি ব্যর্থতা বর্তমান গরোটিনের জন্য স্ট্যাক ট্রেস প্রিন্ট করে, রান-টাইম সিস্টেমের অভ্যন্তরীণ ফাংশনগুলি এলিডিং করে এবং তারপরে প্রস্থান কোড 2 দিয়ে প্রস্থান হয় current যদি বর্তমান গরোটিন না থাকে বা ব্যর্থতা থাকে তবে সমস্ত গোরোটিনের জন্য স্ট্যাক ট্রেস প্রিন্ট করে The রান-সময় অভ্যন্তরীণ।
Reasonsতিহাসিক কারণে, GOTRACEBACK সেটিংস 0, 1 এবং 2 যথাক্রমে কোনও, সমস্ত এবং সিস্টেমের প্রতিশব্দ।
রানটাইম / ডিবাগ প্যাকেজের সেটট্র্যাসব্যাক ফাংশন রান সময় আউটপুটের পরিমাণ বাড়িয়ে তুলতে দেয় তবে পরিবেশের ভেরিয়েবলের দ্বারা নির্দিষ্ট করা নীচের পরিমাণটি এটি হ্রাস করতে পারে না। Https://golang.org/pkg/runtime/debug/#SetTraceback দেখুন ।