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


91

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

গোলাংকে কীভাবে সমস্ত গরোটিন স্ট্যাক ট্রেস মুদ্রণ করতে দেয়?


এটা কি তোমার প্রশ্নের উত্তর? কীভাবে প্যানিকের
স্ট্যাকট্রেস পাবেন

উত্তর:


107

বর্তমান গোরোটিনের জন্য স্ট্যাক ট্রেস প্রিন্ট করতে , 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)

4
এটি কি সমস্ত গরোটিনের স্ট্যাক ট্রেস মুদ্রণ করে?

এটি করা উচিত, এটি কল Stack। "স্ট্যাকটি গোরোটিনের একটি ফর্ম্যাট স্ট্যাক ট্রেস দেয় যা এটি বলে। প্রার্থনা। "
ইন্টারমারনেট

4
দুঃখিত, এটি কেবল বর্তমান গরোটিন স্ট্যাক ট্রেস প্রিন্ট করে।

4
@ হাওয়ার্ডগুও আমি স্টেমের সমস্ত চিহ্ন ছুঁড়ে ফেলার জন্য রানটাইম / পিপ্রিফ ব্যবহার করে একটি উদাহরণ যুক্ত করেছি।
ইন্টারমারনেট

4
আমি মনে করি এটি কেবল প্রতিটি থ্রেডের বর্তমানে চলমান গরোটিনকে আউটপুট দেয়, সমস্ত গরোটিনগুলি নয়, যেমন: play.golang.org/p/0hVB0_LMdm
রোজারডপ্যাক

41

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


আমি এটি দ্বারা চালিত এটি কেবলমাত্র যতদূর দেখি মৃত্যুদন্ড কার্যকর করা দেখায়। মেইন.গো চালু হওয়ার পরে কার্যকর করা সমস্ত "পদ্ধতি" দেখতে পাবার কি কোনও উপায় আছে?
লুকাশ লুকাক

38

জাভা আচরণের সিকিওয়েটে স্ট্যাক-ডাম্পের নকল করতে তবে প্রোগ্রামটি এখনও চলছে:

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])
    }
}()

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

@ ব্রায়ান, আপনি স্ট্যাকওভারফ্লো দ্বারা প্রয়োজনীয় সিসি-বাই-এসএ ৩.০ অতিরিক্ত অতিরিক্ত বিএসডি বা আরও অনুমোদনের শর্তাদির অধীনে এটিকে লাইসেন্স দিতে ইচ্ছুক?
চার্লস ডাফি

4
@ চার্লসডুফি আপনি এখানে অ্যাপাচি লাইসেন্সের আওতায় একই জিনিসটি পেতে পারেন: github.com/weaveworks/weave/blob/…
ব্রায়ান

37

জাভা এর মতোই, জিগ প্রোগ্রামের স্ট্যাক ট্রেস এবং এর গোরোটাইনগুলি মুদ্রণের জন্য সিগুয়েট ব্যবহার করা যেতে পারে।
তবে একটি মূল পার্থক্য হ'ল ডিফল্টভাবে জাভা প্রোগ্রামগুলিতে SIGQUIT প্রেরণগুলি সেগুলি বন্ধ করে না, যখন গো প্রোগ্রামগুলি প্রস্থান করে।

বিদ্যমান প্রোগ্রামগুলির সমস্ত গরোটিনগুলির স্ট্যাক ট্রেস মুদ্রণের জন্য এই পদ্ধতির কোনও কোড পরিবর্তন দরকার।

পরিবেশ পরিবর্তনশীল GOTRACEBACK ( রানটাইম প্যাকেজের ডকুমেন্টেশন দেখুন ) উত্পন্ন আউটপুটটির পরিমাণ নিয়ন্ত্রণ করে। উদাহরণস্বরূপ, সমস্ত গরোটিনগুলি অন্তর্ভুক্ত করতে GOTRACEBACK = সব সেট করুন।

স্ট্যাক ট্রেসের মুদ্রণটি একটি অপ্রত্যাশিত রানটাইম শর্ত (আনহ্যান্ডলড সিগন্যাল) দ্বারা ট্রিগার করা হয়েছে, মূলত এই কমিটে নথিভুক্ত , এটি কমপক্ষে 1.1 থেকে পাওয়া থেকে এটি উপলব্ধ করে।


বিকল্পভাবে, যদি সোর্স কোডটি সংশোধন করা কোনও বিকল্প হয় তবে অন্যান্য উত্তর দেখুন।


নোট করুন যে একটি লিনাক্স টার্মিনালে, সিকুইটটি সুবিধামত কী সংমিশ্রণ Ctrl+ সহ প্রেরণ করা যায় \


4
দস্তাবেজগুলি সন্ধান করার সময় আমি সিকোবিট-এর কোনও উল্লেখ পাইনি, বরং স্যাব্যাবআরটি। আমার নিজের পরীক্ষাগুলি থেকে (Go 1.7 সহ) পরবর্তীগুলিও পূর্বের উপর কাজ করেছে।
soltysh

4
এটি শীর্ষ উত্তর হওয়া উচিত।
স্টিভেন সরোকা

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

26

আপনি সমস্ত টাইমস স্টোরের স্ট্যাক ট্রেস পেতে রানটাইম.স্ট্যাক ব্যবহার করতে পারেন :

buf := make([]byte, 1<<16)
runtime.Stack(buf, true)
fmt.Printf("%s", buf)

ডকুমেন্টেশন থেকে:

func Stack(buf []byte, all bool) int

স্ট্যাক কলিং গোরোটিনের স্ট্যাক ট্রেসকে বুফে রূপ দেয় এবং বুফে লিখিত বাইটের সংখ্যা প্রদান করে। যদি সমস্ত সত্য হয়, স্ট্যাক ফর্ম্যাটগুলি বর্তমান গরোটিনের সন্ধানের পরে অন্য সমস্ত গরোটিনগুলির ট্রেসকে বুফে পরিণত করে।


এর মধ্যে সমস্ত গোরোটাইনগুলির ব্যাকট্রেস অন্তর্ভুক্ত রয়েছে , দুর্দান্ত!
রজারডপ্যাক

এটি কি এমন ফর্ম্যাট যা কোনও অপ্রকাশিত আতঙ্ক ব্যবহারের জন্য ফোটায়?
Ztyx

4
স্ট্রিং (বুফ) যুক্ত করতে ভুলবেন না বা আপনি সেখানে কাঁচা বাইটগুলি মুদ্রণ করবেন।
কোডা

4
হতে পারে আমি কিছু ভুল করছি, বা সম্ভবত কার্যকারিতা পরিবর্তিত হয়েছে, তবে এটি আমার জন্য খালি বাইটের স্লাইস ছাড়া আর কিছু অর্জন করতে পারে না?
17xand

4
@ কোদা string(buf)এখানে করার দরকার নেই, fmt.Printf("%s", buf)এবং fmt.Printf("%s", string(buf))ঠিক একই জিনিসটি করুন ( fmtপ্যাকেজের জন্য ডকস দেখুন ); এখানে কেবল পার্থক্য হ'ল stringসংস্করণটি বাইটগুলি অনুলিপি করবেbuf অযথা
kbolino

20

CTRL + Press টিপুন

(আপনি যদি এটি কোনও টার্মিনালে চালনা করেন এবং কেবল আপনার প্রোগ্রামটি মেরে ফেলতে চান এবং রুটিনগুলি ডাম্প করতে পারেন)

আমি এই প্রশ্নটির মূল সিকোয়েন্সটি খুঁজছি। আমার প্রোগ্রামটি গো রুটিনগুলি ফাঁস হচ্ছে কিনা তা জানাতে কেবল একটি দ্রুত এবং সহজ উপায় চেয়েছিলেন :)


11

* এনআইএক্স সিস্টেমগুলিতে (ওএসএক্স সহ) একটি সিগন্যাল বাতিল প্রেরণ করুন SIGABRT:

pkill -SIGABRT program_name


স্পষ্টতই, একটি জাভা প্রক্রিয়াতে SIGQUIT প্রেরণ এটি SIGABRT এর মতো শেষ করে না
ডেভ সি

আমি এটি মূল প্রশ্নের সবচেয়ে সহজ এবং সর্বাধিক মিলে যাওয়া সমাধান বলে মনে করেছি। আপনার কোড পরিবর্তন না করে প্রায়শই আপনার এখনই স্ট্যাকট্র্যাসের প্রয়োজন হয়।
jotrocken

5

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]))
}


আমি কখনই দেখিনি; আপনি কোন প্ল্যাটফর্মে চলছে?
ব্রায়ান

এটা কি দেখেনি? কোডটি সমস্ত প্ল্যাটফর্মে চালানো উচিত; আমি এটি উইন্ডোজ 7, ​​উবুন্টু 14.04 এবং ম্যাকের মাধ্যমে পরীক্ষা করেছি।
ডেভিড টুটিল

খালি লাইন কখনও দেখেনি।
ব্রায়ান

4

ডিফল্টরূপে, সমস্ত জোরোটাইনগুলির স্ট্যাক ট্রেসগুলি ফেলে দিতে ^\কীগুলি ( CTRL + \ ) টিপুন


অন্যথায়, আরও দানাদার নিয়ন্ত্রণের জন্য, আপনি ব্যবহার করতে পারেন panicGo 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 দেখুন ।

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