স্ক্রিপ্ট লাইন নম্বর ত্রুটি?


105

যদি আমি কমান্ড লাইন (আর - স্ল্যাভ স্ক্রিপ্ট.আর) থেকে একটি দীর্ঘ আর স্ক্রিপ্ট চালাচ্ছি, তবে আমি কীভাবে ত্রুটিতে লাইন নম্বর দিতে পারি?

যদি সম্ভব হয় তবে আমি স্ক্রিপ্টে ডিবাগ কমান্ড যুক্ত করতে চাই না - আমি কেবল চাই যে অন্যান্য অন্যান্য স্ক্রিপ্টিং ভাষার মতো আচরণ করা ...


31
কোন আপডেট? চার বছর পরে, মনে হচ্ছে সমস্যাটি এখনও অবিরত রয়েছে, মূলধারার আর গ্রহণের পরেও
গুই অ্যামব্রোস

আমার প্রচুর ছোট আউটপুট সহ একটি লম্বা আর স্ক্রিপ্ট রয়েছে, আমি হার্ড-কোডিং লাইন নম্বরগুলির পরিবর্তে সি এর মতো (আন্ডারস্কোর) (আন্ডারস্কোর) লাইন / ফাইল (আন্ডারস্কোর) (আন্ডারস্কোর) (লাইন নম্বর এবং স্ক্রিপ্টের নাম) মুদ্রণ করতে চাই উত্স মধ্যে।
মোশ

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

উত্তর:


45

এটি আপনাকে লাইন নম্বর দেবে না, তবে এটি আপনাকে বলবে যে কল স্ট্যাকের ব্যর্থতা কোথায় ঘটে যা খুব সহায়ক:

traceback()

[সম্পাদনা:] কমান্ড লাইন থেকে স্ক্রিপ্ট চালানোর সময় আপনাকে একটি বা দুটি কল এড়িয়ে যেতে হবে, ইন্টারেক্টিভ এবং অ-ইন্টারেক্টিভ আর সেশনগুলির জন্য ট্রেসব্যাক () দেখুন

আমি সাধারণ ডিবাগিং সন্দেহবাদীদের ছাড়া এটি করার অন্য কোনও উপায় সম্পর্কে অবগত নই:

  1. ডিবাগ ()
  2. ব্রাউজার ()
  3. বিকল্পগুলি (ত্রুটি = পুনরুদ্ধার) [এরপরে বিকল্পগুলি অনুসরণ করে (ত্রুটি = নুল) এটিকে ফিরিয়ে আনতে]

আপনি এই সম্পর্কিত পোস্টটি দেখতে চাইবেন।

[সম্পাদনা:] দুঃখিত ... সবেমাত্র দেখেছি আপনি কমান্ড লাইন থেকে এটি চালাচ্ছেন। সেক্ষেত্রে আমি বিকল্পগুলির (ত্রুটি) কার্যকারিতা নিয়ে কাজ করার পরামর্শ দেব। এখানে একটি সাধারণ উদাহরণ:

options(error = quote({dump.frames(to.file=TRUE); q()}))

আপনি কোনও ত্রুটি শর্তে যেমন চান তেমন বিস্তৃত স্ক্রিপ্ট তৈরি করতে পারেন, তাই আপনার ডিবাগিংয়ের জন্য কোন তথ্যটি প্রয়োজন তা কেবল আপনার সিদ্ধান্ত নেওয়া উচিত।

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


প্রথম [সম্পাদনা:] ব্লকের সাথে সংযুক্ত সমাধানটি আমার পক্ষে কাজ করে। সেরা পন্থাটি মনে হয় @ শেফার্ডের মন্তব্য, অর্থাৎ যুক্ত করুন options(error=function() { traceback(2); if(!interactive()) quit("no", status = 1, runLast = FALSE) })(গৃহীত উত্তরের মন্তব্য দেখুন)। আমি মনে করি এটি কেবল অন্য থ্রেডের লিঙ্ক সরবরাহ করার চেয়ে এখানে উত্তরে এটি যুক্ত করা অর্থপূর্ণ হবে।
cryo111

1
একটি নতুন বিকল্প যা আপনাকে ট্রেসব্যাক github.com/aryoda/tryCatchLog
লুঙ্গুইনি

13

এরকম options(error=traceback)লাইন ত্রুটির অগ্রসর হওয়ার বিষয়বস্তু সম্পর্কে একটু বেশি তথ্য প্রদান করে। এটিতে কোনও ত্রুটি থাকলে একটি ট্রেসব্যাক উপস্থিত হওয়ার কারণ হয়ে থাকে এবং কিছু ত্রুটির জন্য এটির লাইন নম্বর থাকে যার দ্বারা উপসর্গ করা হয় #। তবে এটি আঘাত বা মিস, অনেক ত্রুটি লাইন নম্বর পাবে না।


2
আমার জন্য বেশ কাজ করে না। আমি কেবল একটি ফাইল পেয়েছি এবং এটি লাইন নম্বরটি প্রদর্শন করে না, কেবল No traceback availableত্রুটির পরে বলেছে ।
লাকাতা

11

এর জন্য সমর্থনটি আগামী ২.১০ এবং পরবর্তী সময়ে আসবে। ডানকান মুরডোক সন্ধানী লাইননাম এবং সেটব্রাইপয়েন্ট সম্পর্কে 10 সেপ্টেম্বর ২০০৯ এ সবেমাত্র নতুন করে পোস্ট করেছেন :

ডিবাগিংয়ে সহায়তা করার জন্য আমি আর-ডেভেল-এ কেবল কয়েকটি ফাংশন যুক্ত করেছি। findLineNum()কোন ফাংশনের কোন লাইন সোর্স কোডের একটি নির্দিষ্ট রেখার সাথে সাদৃশ্যযুক্ত তা আবিষ্কার করে; setBreakpoint()এর আউটপুট নেয় findLineNumএবং trace()সেখানে একটি ব্রেকপয়েন্ট সেট করতে কল করে।

এগুলি কোডে উত্স রেফারেন্স ডিবাগ তথ্য রাখার উপর নির্ভর করে। কোড দ্বারা পঠিত এটি ডিফল্ট source(), তবে প্যাকেজগুলির জন্য নয়। প্যাকেজ কোডে উত্স রেফারেন্সগুলি পেতে, পরিবেশের পরিবর্তনশীল সেট করুন R_KEEP_PKG_SOURCE=yes, বা আর এর মধ্যে সেট করুন options(keep.source.pkgs=TRUE), তারপরে উত্স কোড থেকে প্যাকেজটি ইনস্টল করুন। ?findLineNumবিশ্বব্যাপী পরিবেশে অনুসন্ধান সীমাবদ্ধ না করে প্যাকেজগুলির মধ্যে কীভাবে এটি অনুসন্ধান করতে বলা যায় সে সম্পর্কে বিশদ পড়ুন ।

উদাহরণ স্বরূপ,

x <- " f <- function(a, b) {
             if (a > b)  {
                 a
             } else {
                 b
             }
         }"


eval(parse(text=x))  # Normally you'd use source() to read a file...

findLineNum("<text>#3")   # <text> is a dummy filename used by
parse(text=)

এটি মুদ্রণ করবে

 f step 2,3,2 in <environment: R_GlobalEnv>

এবং আপনি ব্যবহার করতে পারেন

setBreakpoint("<text>#3")

সেখানে একটি ব্রেকপয়েন্ট সেট করতে।

কোডটিতে এখনও কিছু সীমাবদ্ধতা রয়েছে (এবং সম্ভবত বাগগুলি); আমি ঠিক করছি


ধন্যবাদ। আর-ডেভেল মেলিং তালিকার জন্যও সাইন আপ করেছেন। আমি এই ধারণাটি নিয়ে আর-এড়িয়ে চলেছি যে এটি আমার ইনবক্সটি আটকে রাখবে (আর-সিগ-ফিনান্স ইতিমধ্যে এটি করে)।
শেন

1
আর স্ক্রিপ্টে
ঝাঁকুনি

1
@ হিরসে: এটি আপনার দশ বছরের পুরানো উত্তর। আমি উদ্ধৃত করছিলাম এমন ভান করার জন্য কেন আপনি পৃথিবীতে পুনরায় ফর্ম্যাট করলেন? আমি ছিলাম না এবং আপনার পরিবর্তনটি আমার অভিপ্রায় প্রতিফলিত করে না
ডার্ক এডেলবুয়েটেল

"ডানকান মুরডোচ সবেমাত্র পোস্ট করেছেন:" অনেকটা উদয়ের মতো মনে হচ্ছে তবে এটি সঠিক না হলে দয়া করে সম্পাদনাটি ফিরিয়ে দিন। আমি এটিকে নিজের জন্য আরও পঠনযোগ্য করে তুলতে চেয়েছিলাম এবং আমার কাজ শেষ হওয়ার আগে তারিখটি পরীক্ষা করে দেখিনি। যদি পুরো উত্তরটি খুব পুরানো হয় তবে আপনি ভবিষ্যতের পাঠকদের বিভ্রান্তি দূর করতে এটি মুছতেও পারেন।
কৃশ

আপনি কি এটি ফিরিয়ে দিতে পারেন? ধন্যবাদ.
ডর্ক এডেলবুয়েটেল

6

আপনি সেট করে

options(show.error.locations = TRUE)

আমি শুধু ভাবছি কেন এই সেটিংটি আর-এ ডিফল্ট নয়? এটি অন্য ভাষার মতোই হওয়া উচিত।


1
এই বিকল্প সম্পর্কে ব্যাকগ্রাউন্ড তথ্যের জন্য দেখুন স্ট্যাটাস.টিজ.সিএইচ
আর-

1
এটি কাজ করত, তবে এটি অক্ষম ছিল কারণ এটি নির্ভরযোগ্য নয়। আমি মনে করি এটি আরস্টুডিও ব্যবহার করার জন্য আপনাকে জোর করার একটি প্রয়াস যা শেষ পর্যন্ত অ-মুক্ত হবে।
এরিক লেসচিনস্কি

6
আমি এটাকে সন্দেহ করি. আর কোর এবং আরস্টুডিও খুব আলাদা সংগঠন এবং বিশেষত আর কোর হ'ল কট্টর উন্মুক্ত উত্স।
বেন বলকার

সেন্টওএস 6.9 কাজ, আর-3.4.2
irritable_phd_syndrom

সম্ভবত এটি উল্লেখ করার মতো, কোনও কোড স্যুর করার আগে আপনার বিকল্পগুলি সামনে রাখা উচিত।
JAponte

3

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

যেমনটি আমি এটি কনফিগার করেছি, ত্রুটি পরিচালনার ফলে ত্রুটি হওয়ার সময় মেমরির সমস্ত কাজ করে এমন একটি আরডিটা ফাইল তৈরি হয়। এই ডাম্পটি পুনরায় ব্যবহার করে আর এর মাধ্যমে আবার পড়তে পারে load()এবং ত্রুটির সময়ে উপস্থিত বিভিন্ন পরিবেশের সাথে ইন্টারেক্টিভভাবে এটি ব্যবহার করে পরিদর্শন করা যেতে পারে debugger(errorDump)

আমি নোট করব যে আমি traceback()স্ট্যাকের মধ্যে যে কোনও কাস্টম ফাংশন থেকে আউটপুটে লাইন নম্বর পেতে সক্ষম হয়েছি , তবে আমার স্ক্রিপ্টে ব্যবহৃত কোনও কাস্টম ফাংশন keep.source=TRUEকল source()করার সময় আমি যদি বিকল্পটি ব্যবহার করি তবেই । এই বিকল্পটি ব্যতীত, বিশ্বব্যাপী ত্রুটি পরিচালনার বিকল্পটিকে নীচের হিসাবে সেট করে traceback()নামটির একটি ত্রুটিযুক্ত লগের সম্পূর্ণ আউটপুট প্রেরণ করে error.log, তবে লাইন নম্বরগুলি উপলভ্য ছিল না।

আমি আমার ওয়ার্কফ্লোতে যে সাধারণ পদক্ষেপ নিয়েছি তা এখানে এবং আমি অ-ইন্টারেক্টিভ আর ব্যর্থতার পরে কীভাবে মেমরি ডাম্প এবং ত্রুটি লগটিতে অ্যাক্সেস করতে সক্ষম হয়েছি।

  1. কমান্ড লাইন থেকে আমি কল করছি প্রধান স্ক্রিপ্টের উপরে আমি নীচে রেখেছি। এটি আর সেশনের জন্য বিশ্বব্যাপী ত্রুটি পরিচালনার বিকল্প সেট করে। আমার মূল স্ক্রিপ্ট বলা হয়েছিল myMainScript.R। কোডের বিভিন্ন লাইনে তারা কী করে তা বর্ণনা করার পরে তাদের মন্তব্য রয়েছে। মূলত, এই বিকল্পের সাহায্যে, আর যখন ট্রিগার stop()ঘটিত একটি ত্রুটির মুখোমুখি হয় , এটি ডিরেক্টরিতে সমস্ত সক্রিয় পরিবেশে কাজ করার মেমরির একটি আরডিটা (* .rda) ডাম্প ফাইল তৈরি ~/myUsername/directoryForDumpকরবে এবং error.logকিছু কার্যকর তথ্য সহ একটি ত্রুটি লগও লিখে দেবে একই ডিরেক্টরি ত্রুটিযুক্ত অন্যান্য হ্যান্ডলিং যুক্ত করতে আপনি এই স্নিপেটটি সংশোধন করতে পারেন (যেমন, ডাম্প ফাইলে একটি টাইমস্ট্যাম্প যুক্ত করুন এবং ত্রুটি লগ ফাইলের নাম ইত্যাদি),

    options(error = quote({
      setwd('~/myUsername/directoryForDump'); # Set working directory where you want the dump to go, since dump.frames() doesn't seem to accept absolute file paths.
      dump.frames("errorDump", to.file=TRUE, include.GlobalEnv=TRUE); # First dump to file; this dump is not accessible by the R session.
      sink(file="error.log"); # Specify sink file to redirect all output.
      dump.frames(); # Dump again to be able to retrieve error message and write to error log; this dump is accessible by the R session since not dumped to file.
      cat(attr(last.dump,"error.message")); # Print error message to file, along with simplified stack trace.
      cat('\nTraceback:');
      cat('\n');
      traceback(2); # Print full traceback of function calls with all parameters. The 2 passed to traceback omits the outermost two function calls.
      sink();
      q()}))
  2. নিশ্চিত করুন যে মূল স্ক্রিপ্ট এবং পরবর্তী কোনও ফাংশন কল থেকে, যে কোনও সময় কোনও ফাংশন উত্সাহিত হয়, বিকল্পটি keep.source=TRUEব্যবহৃত হয়। এটি একটি ফাংশন উত্স, আপনি ব্যবহার করবে source('~/path/to/myFunction.R', keep.source=TRUE)traceback()আউটপুটটিতে লাইন নম্বর ধারণের জন্য এটি প্রয়োজনীয় । দেখে মনে হচ্ছে আপনি বিশ্বব্যাপী এই বিকল্পটি সেট করতেও সক্ষম options( keep.source=TRUE )হতে পারেন তবে এটি কার্যকর হয় কিনা তা দেখার জন্য আমি এটি পরীক্ষা করিনি। আপনার যদি লাইন নম্বরগুলির প্রয়োজন না হয় তবে আপনি এই বিকল্পটি বাদ দিতে পারেন।

  3. টার্মিনাল থেকে (আর এর বাইরে) ব্যাচ মোডে ব্যবহার করে প্রধান স্ক্রিপ্টটি কল করুন Rscript myMainScript.R। এটি একটি নতুন অ-ইন্টারেক্টিভ আর সেশন শুরু করে এবং স্ক্রিপ্টটি চালায় myMainScript.R। পদক্ষেপ 1 এ প্রদত্ত কোড স্নিপেট যা myMainScript.Rঅ-ইন্টারেক্টিভ আর সেশনের জন্য ত্রুটি পরিচালনার বিকল্পটিকে শীর্ষে স্থাপন করেছে ।
  4. কার্যকর করার মধ্যে কোথাও একটি ত্রুটি মোকাবেলা করুন myMainScript.R। এটি নিজেই মূল স্ক্রিপ্টে থাকতে পারে বা বেশ কয়েকটি ফাংশন গভীরভাবে বাসাতে পারে। ত্রুটির মুখোমুখি হয়ে গেলে, পদক্ষেপ 1-এ নির্দিষ্ট করা হিসাবে হ্যান্ডলিং করা হবে এবং আর সেশনটি সমাপ্ত হবে।
  5. নামের একটি আরডিটা ডাম্প ফাইল errorDump.rdaএবং নামযুক্ত ত্রুটি লগ বিশ্বব্যাপী ত্রুটি হ্যান্ডলিং বিকল্প সেটিং error.logদ্বারা নির্দিষ্ট ডিরেক্টরিতে তৈরি করা হয় '~/myUsername/directoryForDump'
  6. আপনার অবসর সময়ে, error.logত্রুটি বার্তা নিজেই এবং ত্রুটির দিকে পরিচালিত পুরো স্ট্যাক ট্রেস সহ ত্রুটি সম্পর্কিত তথ্য পর্যালোচনা করতে পরিদর্শন করুন। এখানে ত্রুটির ফলে উত্পন্ন লগের একটি উদাহরণ রয়েছে; #অক্ষরের পরে নম্বরগুলি কল স্ট্যাকের বিভিন্ন পয়েন্টে ত্রুটির লাইন নম্বরগুলি মনে করুন:

    Error in callNonExistFunc() : could not find function "callNonExistFunc"
    Calls: test_multi_commodity_flow_cmd -> getExtendedConfigDF -> extendConfigDF
    
    Traceback:
    3: extendConfigDF(info_df, data_dir = user_dir, dlevel = dlevel) at test_multi_commodity_flow.R#304
    2: getExtendedConfigDF(config_file_path, out_dir, dlevel) at test_multi_commodity_flow.R#352
    1: test_multi_commodity_flow_cmd(config_file_path = config_file_path, 
    spot_file_path = spot_file_path, forward_file_path = forward_file_path, 
    data_dir = "../", user_dir = "Output", sim_type = "spot", 
    sim_scheme = "shape", sim_gran = "hourly", sim_adjust = "raw", 
    nsim = 5, start_date = "2017-07-01", end_date = "2017-12-31", 
    compute_averages = opt$compute_averages, compute_shapes = opt$compute_shapes, 
    overwrite = opt$overwrite, nmonths = opt$nmonths, forward_regime = opt$fregime, 
    ltfv_ratio = opt$ltfv_ratio, method = opt$method, dlevel = 0)
  7. আপনার অবসর সময়ে, আপনি errorDump.rdaব্যবহার করে একটি ইন্টারেক্টিভ আর সেশনে লোড করতে পারেন load('~/path/to/errorDump.rda')। একবার লোড হয়ে গেলে, যে debugger(errorDump)কোনও সক্রিয় পরিবেশে মেমরির সমস্ত আর অবজেক্ট ব্রাউজ করতে কল করুন । debugger()আরও তথ্যের জন্য আর সহায়তা দেখুন ।

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


0

প্রথম, options(show.error.locations = TRUE)এবং তারপর traceback()। ত্রুটির রেখা নম্বরটি # এর পরে প্রদর্শিত হবে

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