Build เกมออกมาแล้ว Debug.Log มันยังอยู่!

ผมเคยมีความเข้าใจผิดของ Debug.Log ใน Unity อย่างนึง ว่าใน build จริงที่ไม่ได้ติ้ก Development Build แล้วพวก log ที่พ่นๆไว้มันจะหายไปเอง…

Build เกมออกมาแล้ว Debug.Log มันยังอยู่!

ผมเคยมีความเข้าใจผิดของ Debug.Log ใน Unity อย่างนึง ว่าใน build จริงที่ไม่ได้ติ้ก Development Build แล้วพวก log ที่พ่นๆไว้มันจะหายไปเอง แต่จริงๆไม่ใช่นะครับ มันยังอยู่ครบเลย 555

ซึ่งทางฝั่ง Android สามารถต่อมือถือเข้าคอมแล้วใช้เครื่องมืออย่าง adb logcat อ่าน log ที่ว่าได้ครับ แล้วยิ่งเวอร์ชั่นล่าสุด 2017.1 ตรง Editor มันมีที่ให้ต่อดูง่ายๆด้วย แต่กรณีนี้ใช้ได้กับเกมตัวเองเท่านั้น

สาธิต

เพื่อเป็นการสาธิตผมจะลองเปิดเกมของคนอื่นที่ค่อนข้างมั่นใจว่าใช้ Unity ดู เกมนี้ชื่อเกม VOEZ โดยผมต่อ USB เข้าคอมแล้วใช้เครื่องมือของ Google คือ adb logcat

จะเห็นว่ามีหลงมาจริงๆด้วย โดยดูได้จากตรง log ที่เขียนว่า Unity : นำหน้าแปลว่ามาจาก process ของ Unity อันนี้เห็นว่าเป็นชื่อผมที่ login เข้าเกม เหมือนจะเป็นคำสั่งที่ส่งไปที่ endpoint นึงของเขาเพื่อ login

จะเห็นว่าถึงดูได้ก็ไม่ได้มีอันตราย ถ้าเกมเขียนแบบไม่มีข้อมูล sensitive ที่ฝั่ง client ก็ไม่ต้องกังวลอะไรมาก แต่ก็ระวังไว้ด้วยเช่นถ้าใครเผลอ log password ทิ้งไว้ดู debug แล้วมันโชว์ขึ้นมาแบบนี้ก็คงจะรู้สึกไม่ปลอดภัยแปลกๆ

ระวังเรื่อง error จาก method/library ต่างๆ

ทีนี้จะลองตั้งใจให้ error ดูบ้างก็คือปิดเน็ตก่อนแล้วกดดู scoreboard

โฆษณา

เรื่องของ Error ที่ต้องระวังคือเราไม่ได้เขียน Debug.Log ไว้เอง แต่มันก็ขึ้นมาเตือนเรา ซึ่งตรงนี้ก็ดีแล้วที่มันเตือนคนทำเกม แต่ก็ต้องนึกดูดีๆด้วยว่ามีข้อมูลอะไรสำคัญมั้ย อย่างอันนี้มันทำให้ผมรู้ว่าเกมนี้เขาใช้ endpoint URL leaderboard หน้าตายังไง และมี access_token แถมท้ายมา ซึ่งใช้ประโยชน์อะไรได้มั้ยก็คงไม่ล่ะมั้ง แต่ถ้าเกมของเราก็ไม่แน่ครับ

(อย่างตอนนี้ Firebase ที่ผมใช้ ถ้า permission denied ขึ้นมามันจะฟ้อง address ที่เราเก็บข้อมูลใน realtime database มาด้วย ก็ให้มั่นใจด้วยว่าใน address นั่นไม่มีข้อมูลสำคัญ)

แล้วก็ Error ที่มาจาก library อื่นที่เราดึงมาใช้ ทำยังไงเราก็อาจจะปิดมันไม่ได้ยิ่งถ้ามันเป็น dll ไปแล้ว อันนี้ก็คงจะทำอะไรได้ไม่มากครับ

เมื่อเริ่มเพลงหรือลองกด retry ดูก็เห็น log ขึ้นมาอีก อันนี้เข้าใจว่าอาจจะเป็น analytics ไว้สะสมข้อมูลจากผู้เล่นว่าเพลงไหนฮิต เห็น JSON นี้ก็คงไม่มีประโยชน์อะไร นอกจากรู้ว่าระดับยากสุดเดิมมันชื่อ Extra ไม่ใช่ Special

เล่นเสร็จก็ขึ้นอีก

กดกาชาก็ขึ้นครับ แล้วก็อันนี้ result มันขึ้นไวมากเลย เดาๆว่ามันอาจจะ gen result ในเครื่องไม่ใช่จาก server 555 แต่เกมนี้กาชามันก็ไม่ค่อยอะไรมาก

มาลองดูอีกเกมบ้าง เกมนี้ชื่อเกม Lanota

อันนี้มาอย่างหล่อเลย… แต่จริงๆแล้วเป็นชื่อ achievement ต่างหาก

Error ของ Unity ก็ต้องระวังครับ

อีกอันที่เราห้ามไม่ได้ก็คือ error ของ Unity เอง จะสังเกตเห็นว่ามีตัว W นำหน้า มันคือ Warning สีเหลืองใน Unity นั่นเองครับ เช่นอันนี้ component หาย บางคนอาจจะเคยเจอตอนทำเกม

จะเห็นว่า ชื่อ game object หลุดออกมาสู่สาธารณะชนได้ ซึ่งนอกจากจะเขินนิดหน่อยแล้วคงไม่อะไรมาก ถ้าไม่ได้ตั้งชื่อ game object แบบ พ่องตาย อะไรแบบนี้ก็ไม่น่าจะเป็นไรครับ 555

แล้วก็ชื่อ script ที่หายโดน strip ออกไปหมดแล้ว (จะเห็นว่า Filename ก็ไม่มีอะไรต่อ) แต่ถ้าติ้ก Development Build ไว้ จะเห็นได้ไปถึงบรรทัดโค้ดเลยในบาง log เพื่อให้เราไปตามแก้ปัญหาได้

มาดูเกมสุดท้ายคือ Dynamix กันบ้างครับ

สะกดภาษาอังกฤษผิดก็เขินไป 555

อันนี้เครื่องที่เต็มระหว่างโหลดไฟล์เสริม เลยทำให้รู้ว่าเจ้านี้ใช้ AWS เก็บของเพราะเห็น URL endpoint ขึ้นมา

โฆษณา 2

ก่อนเริ่มเพลงแต่ละครั้งจะเห็นเลขปริศนาขึ้นมาซึ่งคาดว่าน่าจะเป็น offset ของเพลงที่เลือก

เหมือนได้เผือกเกมชาวบ้านไปทั่ว สนุกมั้ย 555

ฝั่ง iOS ก็ดู log ได้

ใช้ XCode แล้วไปที่ Window > Devices เลือกเครื่องที่ต่ออยู่ (ต้องเปิดโปรแกรมอะไรซักอย่างก่อนถึงจะเลือกได้) แล้วก็กดไอ้ลูกศรที่มุมล่างให้ console งอกขึ้นมาได้ครับ อันนี้จะดูยากขึ้นหน่อยเพราะไม่มีคำว่า Unity แต่อาจจะเห็นชื่อแอพแบบนี้

จะเห็นว่าตัวอย่างที่ยกไป ก็ไม่ค่อยเห็นอะไรอันตรายออกมาซึ่งก็เป็นเรื่องดีครับ แต่ระวังของเกมตัวเองก็แล้วกัน!

แล้วจะทำไงให้หายไป!

ไอ้ log นี้จริงๆมันสามารถทำให้เกมช้าลงได้เลยนะถ้าปริ้นต์รัวๆ หลายๆคนอาจจะเคยสัมผัสการต้องปริ้นต์รัวๆตอน debug เกม แล้วพบว่าเกมอืดลงมาก

แต่ก่อนเราต้องไป hijack คลาส Debug ให้ .Log มันไปเป็นของเราเอง จากนั้นเราก็จัดการปิดให้หายไปได้ แล้วพอจะทำเกมต่อก็มาเปิดใหม่ ซึ่งวุ่นวายพอสมควร

แต่จาก Unity 5.3 เป็นต้นมามันมีการอัพเกรดคลาส Debug แล้ว เราสามารถเข้าถึงตัวแปร logger ได้ (เปลี่ยนเป็นระบบ log ของเราเองก็ได้ ถ้าเขียน ILogger ขึ้นมาเอง) ดังนั้นคอมโบกับ preprocessor DEVELOPMENT_BUILD ที่จะเปิดปิดเองจากที่ติ้กตรงนั้น เราก็อาจจะทำงี้

#if DEVELOPMENT_BUILD || UNITY_EDITOR
    Debug.unityLogger.logEnabled = true;
#else
    Debug.unityLogger.logEnabled = false;
#endif

ก็น่าจะเวิร์คนะครับ เวลาไม่ได้ติ้กไอ้นั่นมันจะได้หายไปหมด (ยังไม่ได้ลองนะ!)

Edit : โอเคลองแล้ว log หายหมดจริงๆ log จาก Firebase ที่เราเข้าถึงโค้ดไม่ได้อะไรงี้ก็หายหมด