Metin2 syserr Mesajları: Sık Görülen Hatalar Ne Anlama Gelir?
Hazırlayan: Metin2VIP Editörleri Yayın: 9 dk okuma
İçindekiler
syserr, her Metin2 çekirdeğinin kendi klasörüne yazdığı hata günlüğüdür. db çekirdeği db klasörüne, auth ve kanal çekirdekleri kendi klasörlerine yazar; her satır SYSERR:, tarih ve hatayı üreten fonksiyonun adıyla başlar ve aynı satır syslog'a da kopyalanır. Açılmayan bir çekirdekte ilk bakılacak yer syserr'in son satırlarıdır. Bir istisna var: CONFIG ve MySQL bağlantı hataları günlük açılmadan önce çıktığı için syserr'e değil ekrana yazılır.
Aşağıdaki mesajlar sunucu kaynağındaki sys_err(...) çağrılarından, koddaki yazımlarıyla seçildi; %s, %d gibi yerlere çalışırken dosya adı, numara ya da isim gelir. Değerler ve dosya yolları serverden servere değişebilir, mesaj metinleri bu kaynağı kullanan çekirdeklerde aynıdır. Klasör düzeni Metin2 server dosyaları yazısında.
syserr, syslog ve PTS arasındaki fark ne?
Üç dosyayı da çekirdek kütüphanesi libthecore/src/log.c açar; FreeBSD'de adları syslog, syserr ve PTS, Windows derlemesinde .txt uzantılıdır (log.c:10-18).
| Dosya | İçeriği | Ömrü |
|---|---|---|
| syserr | Yalnız sys_err satırları |
Sona eklenerek açılır, döndürülmez; temizlenene kadar büyür |
| syslog | sys_log satırları ve bütün sys_err satırlarının kopyası |
Her saat log/YYYYAAGG/syslog.SS adıyla taşınır, gün değişince 3 gün önceki klasör silinir |
| PTS | Başarım izi (pt_log) |
Her açılışta sıfırlanır; oyun çekirdeğinde ENABLE_PTLOG kapalı olduğu için boş kalır |
_sys_err her satırı önce syserr'e, sonra syslog'a yazar (log.c:109-141); saatlik taşıma yalnız syslog'a uygulanır (log.c:99-106, :390-451). sys_log(0, ...) satırları her zaman yazılır, diğer seviyeler çekirdeğin -l seçeneğiyle açılır (log.c:188-193, game/src/main.cpp:659-664). Bu kaynakta açık gelen ENABLE_SYSLOG_PACKET_SENT, istemciye giden her paket için SENT HEADER : %u to %s (size %d) satırını seviye 0 ile yazar (desc.cpp:431-434); canlı sunucuda syslog'u hızla büyüttüğü için kapatılması mantıklıdır.
Bir syserr satırı şöyle görünür:
SYSERR: Oct 18 21:30:41 :: ReadSpecialDropItemFile: ReadSpecialDropItemFile : there is no item 99999 : node Yeni_Sandik
SYSERR: Oct 18 21:30:41 :: Boot: cannot load SpecialItemGroup: locale/turkey/special_item_group.txt
:: işaretinden sonraki ilk kelime fonksiyonun sınıfsız adıdır (Boot, CInputDB::Boot demektir); satır numarası yazılmaz (log.c:122). Mesajın sabit kısmını game/src ve db/src içinde grep ile aramak çağrının yerini bulur. Quest fonksiyonlarındaki sys_err çağrıları QuestError üzerinden geçer (questlua.cpp:21-26); TEST_SERVER açıksa aynı hata oyuncuya grup sohbetinden error occurred on [%s:%d] diye de gider (questmanager.cpp:1742-1761).
Çekirdek açılmıyor ama syserr boş
Oyun çekirdeği CONFIG'i config_init ile okur (main.cpp:709), günlük dosyalarını ise ondan sonra thecore_init içinde açar (main.cpp:719, libthecore/src/main.c:64). Dosya açılmadan çağrılan sys_err hiçbir şey yazmaz (log.c:118-119); bu yüzden CONFIG ve MySQL bağlantı hataları fprintf(stderr, ...) ile ekrana yazılır ve çekirdek exit(1) ile kapanır. DB_PORT not configured, HOSTNAME must be configured. ve cannot start server while no common sql connected bu türdendir (config.cpp:510, 1623, 1635). Çekirdek daha sonra kendi standart çıktısını klasördeki stdout dosyasına yönlendirir (main.cpp:716-717), standart hata ise ekranda kalır.
db çekirdeğinde de Loading conf.txt failed. ve Could not load mob_proto.txt. Wrong file format? gibi satırlar ekrana yazılır (db/src/Main.cpp:136, ClientManagerBoot.cpp:225). Bu iletilerin tablosu server kurulumu, CONFIG satırları CONFIG ayarları, conf.txt satırları db conf.txt yazısında. Çekirdek sessizce kapanıyorsa onu yönetim betiği yerine kendi klasöründe elle başlatıp ekrandaki son satıra bakmak en hızlı yoldur.
Açılışta sık görülen syserr mesajları
| Mesaj | Nerede | Anlamı, bakılacak yer |
|---|---|---|
InitializeMobTable FAILED, InitializeItemTable FAILED |
db InitializeTables, ClientManagerBoot.cpp:23, 32 |
Proto okunamadı; ekrandaki "Wrong file format?" satırına ve db klasöründeki txt dosyalarına bak |
ItemProto Reading Failed : Invalid value. (index: %d, col: %d, value: %s) |
db Set_Proto_Item_Table, ProtoReader.cpp:1134 |
item_proto.txt'de tanınmayan tür ya da efsun adı; col sütun numarasıdır |
no result from item_attr, no result from skill_proto |
db InitializeItemAttrTable, InitializeSkillTable, ClientManagerBoot.cpp:638, 519 |
Tablo boş ya da sorgu hata verdi; hemen üstteki AsyncSQL satırı nedeni söyler |
InitializeShopTable : Table count is zero. |
db InitializeShopTable, ClientManagerBoot.cpp:275 |
shop tablosu boş |
InitializeLocalization() ==> DirectQuery failed(%s) |
db InitializeLocalization, ClientManager.cpp:3464 |
common veritabanındaki locale tablosu boş |
SQL_PLAYER not configured (ACCOUNT, COMMON, HOTBACKUP) |
db Start, Main.cpp:282, 309, 336, 365 |
conf.txt'de satır yok |
mob table size error, item table size error |
game Boot, input_db.cpp:562, 584 |
game ile db farklı tables.h ile derlenmiş; ikisini birlikte derle |
cannot load SpecialItemGroup: %s |
game Boot, input_db.cpp:981 |
Kutu grubu dosyası okunamadı; sebep bir üstteki satırda. CommonDropItem, ETCDropItem, DropItemGroup, MOBDropItemFile için aynı biçim (:957-995) |
No such an item (name: %s) |
game ReadCommonDropItemFile, ReadEtcDropItemFile, item_manager_read_tables.cpp:85, 509 |
common_drop_item ya da etc_drop_item'daki ad item_proto'da yok |
ReadSpecialDropItemFile : there is no item %s : node %s |
game ReadSpecialDropItemFile, item_manager_read_tables.cpp:261 |
special_item_group'taki numara item_proto'da yok; node grup adıdır |
ReadMonsterDropItemGroup : Syntax error %s : invalid type %s (kill|drop), node %s |
game ReadMonsterDropItemGroup, item_manager_read_tables.cpp:820 |
mob_drop_item'da Type değeri yanlış ya da büyük harfle yazılmış |
Invalid group syntax token size: %u != 2 (DO NOT SPACE IN NAME) |
game LoadGroup, text_file_loader.cpp:77 |
Grup adında boşluk var; çekirdek hemen çıkar |
cannot load MapIndex: %s |
game Boot, input_db.cpp:1003 |
map/index'teki bir haritanın Setting.txt'si yok (cannot open file: %s) ya da MapSize/CellScale eksik (Invalid Settings file: %s, sectree_manager.cpp:182, 211) |
CHECK! 'Setting.txt' and 'server_attr' MAP_SIZE!! |
game LoadAttribute, sectree_manager.cpp:428 |
server_attr ile Setting.txt'deki harita boyu uyuşmuyor |
read_line: unknown regen type %c |
game read_line, regen.cpp:125 |
Regen satırında tür harfi yanlış ya da satır eksik alanlı; çekirdek çıkar |
In %s, No mob data by vnum %u |
game regen_load_in_file, regen.cpp:567 |
Regen satırındaki canavar mob_proto'da yok; satır atlanır |
LoadGroup : Syntax error %s : no leader vnum, node %s |
game LoadGroup, mob_manager.cpp:342 |
group.txt'de lider satırı eksik; grup yüklenmez |
cannot load DragonSoulTable: %s |
game Boot, input_db.cpp:1011 |
dragon_soul_table.txt denetimi geçmedi; çekirdek kapanmaz |
LOAD_QUESTLIB_FAILURE(%s) |
game InitializeLua, questlua.cpp:761 |
questlib.lua hatalı; settings.lua, translate.lua ve locale.lua için LOAD_SETTINS_FAILURE, LOAD_TRANSLATE_ERROR, LoadQuestLocale(%s) FAILURE. Çekirdek çıkar |
QUEST wrong quest state file for quest %s |
game BuildStateIndexToName, questlua.cpp:628 |
object/state'teki dosya bozuk ya da adı quest adıyla uyuşmuyor; questleri yeniden derle |
Motion: %s have not motlist.txt vnum(%d) folder(%s) |
game GetMotionFileName, motion.cpp:128 |
share/data/monster/<klasör>/motlist.txt yok; klasör adı mob_proto'dan gelir |
Drop ve kutu dosyalarında hata çoğunlukla iki satırdır: alttaki cannot load ... hangi dosyanın okunamadığını, üstteki satır hangi ad ya da grubun sorun çıkardığını söyler. syslog'daki LoadLocaleFile: SpecialItemGroup: %s gibi satırlar da çekirdeğin hangi dosyada durduğunu gösterir. Dosyaların biçimi drop dosyaları, harita klasörü harita ekleme, regen satırları regen dosyaları yazısında.
mob table size error ve Unknown header
Bu iki mesaj dosya değil derleme sorunudur. db her tablonun yapı boyunu açılış paketine yazar, oyun çekirdeği kendi boyuyla karşılaştırır (db/src/ClientManager.cpp:447-453, input_db.cpp:560-587). İki taraftan biri farklı bir service.h ya da tables.h ile derlendiyse çekirdek bu satırla kapanır. db'nin syserr'indeki Unknown header (header: %d handle: %d length: %d) (ClientManager.cpp:2879) ve oyun çekirdeğindeki in InputDB: UNKNOWN HEADER: %d, LAST HEADER: %d(%d), REMAIN BYTES: %d, DESC: %d (input_db.cpp:2569) aynı uyuşmazlığın paket tarafıdır. Nedenleri sistem ekleme hataları yazısında.
cannot load DragonSoulTable
Simya tablosu okunamazsa çekirdek kapanmaz, kapatma satırları kodda yorumdadır (input_db.cpp:1009-1014). Üstteki satırlar eksik grubu söyler, ör. In %s group of ApplyNumSettings, values in Grade(%s) row is invalid. (dragon_soul_table.cpp:293). ENABLE_DS_GRADE_MYTH açık derlenmiş bir çekirdek her grupta altıncı derecenin (grade_myth) satır ve sütununu arar (dragon_soul_table.cpp:14-16, 719-724); beş dereceli bir tabloyla açılırsa denetim yarıda kalır ve dosyanın geri kalanı da denetlenmez. Simyanın oyuncu tarafı simya sistemi yazısında.
Çalışırken görülen mesajlar
| Mesaj | Nerede | Anlamı, bakılacak yer |
|---|---|---|
UNKNOWN HEADER: %d, LAST HEADER: %d(%d), REMAIN BYTES: %d, fd: %d |
game Process, input.cpp:85 |
İstemcinin paketi tanınmadı, bağlantı kapandı; LAST HEADER boyu yanlış paket |
LUA_ERROR: %s ve LUA_ERROR: quest %s.%s %s |
game RunState, questlua.cpp:1040; WriteRunningStateToSyserr, questmanager.cpp:1736 |
Quest çalışırken koptu; ikinci satır quest, durum ve olay |
QUEST NOT END RUNNING on Login/Logout - %s |
game HandleReceiveAllEvent, questnpc.cpp:657 |
login ya da logout olayında bekleten çağrı |
cannot find map location index %d x %d y %d name %s |
game WarpSet, char.cpp:5423 |
Işınlanılan haritayı açan çekirdek yok |
location %d %d not allowed to login this server |
game WarpEnd, char.cpp:5510 |
Oyuncu, haritası MAP_ALLOW'da olmayan çekirdeğe geldi; bu kaynakta köye gönderilir |
cannot create item by vnum %u (name %s id %u) |
game ItemLoad, input_db.cpp:1535 |
Karakterin eşyası item_proto'da yok; eşya yüklenmez |
invalid item vnum %u in safebox: login %s |
db RESULT_SAFEBOX_LOAD, ClientManager.cpp:760 |
Depoda proto'da olmayan eşya var; bu açılışta item_award teslimi atlanır |
EquipTo: invalid wear cell (this: #%d %s wearflag: %d cell: %d) |
game EquipTo, item.cpp:970 |
Kayıtlı yuva numarası WEAR_MAX_NUM dışında; çoğu zaman bir bayrak kapatıldıktan sonra |
AsyncSQL: query failed: %s (query: %s errno: %d) |
ChildLoop, libsql/AsyncSQL.cpp:564 |
MySQL hatası; sorgu metni ve MySQL'in kendi iletisi satırdadır |
LUA_ERROR iki satır olarak okunur: ilki Lua'nın iletisi (çağrılan fonksiyon nil, yanlış tipte argüman), ikincisi quest adı.durum olay biçiminde nerede koptuğu. TEST_SERVER açıkken aynı satır oyuncunun ekranına da düşer. Quest'in yapısı ve olaylar quest yazma yazısında.
MySQL hataları libsql katmanından gelir. Doğrudan sorgular AsyncSQL::DirectQuery : mysql_query error: %s ile (AsyncSQL.cpp:268), arka plandaki sorgular AsyncSQL: query failed ile yazılır; bağlantı koptuğunda ve birkaç başka MySQL hatasında sorgu AsyncSQL: retrying satırıyla yeniden denenir (:567-586). 0,5 saniyeden uzun süren sorgular da syslog'a [QUERY : LONG INTERVAL(OverSec %ld.%ld)] : %s olarak düşer (:530, :593-595). Eksik sütun ya da tablo hataları, bir bayrağın veritabanı güncellemesi yüklenmeden açıldığını gösterir. Tablolar Metin2 veritabanları yazısında.
İstemcideki syserr.txt
İstemci de kendi syserr.txt dosyasını yazar: OpenLogFile, standart hatayı her açılışta sıfırlanan syserr.txt'ye yönlendirir, TraceError her satırı ay gün saat:dakika:milisaniye :: ileti biçiminde ekler (EterBase/Debug.cpp:198-236, 306-316). Bu iki fonksiyon _DISTRIBUTE tanımlıyken susar; projelerin hiçbiri bunu tanımlamadığı için Release derlemesi de yazar. Geliştiricinin en sık göreceği satırlar Unknown packet header: %d, last: %d %d (paket tanımları sunucuyla aynı değil, PythonNetworkStream.cpp:549), CPythonItem::LoadItemTable: invalid item_proto[%s] STRIDE[%d] != sizeof(SItemTable) (GameLib/ItemManager.cpp:286) ve Failed to load script file : %s (root/ui.py:3535) satırlarıdır. Oyuncunun gördüğü kutular ve yükleme ekranı hataları istemci hataları yazısında.
Sık sorulan sorular
- syserr dosyası nerede?
- Her çekirdeğin çalıştığı klasörde: db çekirdeği için db klasöründe, auth için auth klasöründe, kanal çekirdekleri için chan/ch1/core1 gibi klasörlerde. Windows'ta derlenen çekirdek aynı dosyayı syserr.txt adıyla yazar.
- Çekirdek açılmıyor ama syserr boş, neden?
- CONFIG ve SQL bağlantı satırları günlük dosyaları açılmadan önce okunur. Bu aşamadaki hatalar syserr'e değil, başlatma komutunun çalıştığı ekrana yazılır; çekirdeği elle başlatıp ekrandaki son satıra bakmak gerekir.
- syserr neden hiç küçülmüyor?
- Saatlik döndürme yalnız syslog'a uygulanır; syserr sona eklenerek açılır ve kendiliğinden taşınmaz ya da silinmez. Paketteki clear.py ya da yönetim panelinin log temizleme seçeneği dosyayı siler.
- Hata satırında satır numarası yok, kaynakta nasıl bulurum?
- Satırda yalnız fonksiyonun adı yazar. Mesajın sabit kısmını, sayılar ve adlar dışındaki metni, game/src ve db/src içinde grep ile aramak tek bir sys_err çağrısına götürür.
İlgili sayfalar
- Metin2 CONFIG Ayarları: Game Çekirdeği Seçenekleri ve Anlamları (Server kurma)
- Metin2 db conf.txt Ayarları: SQL Satırları, BIND_PORT ve ITEM_ID_RANGE (Server kurma)
- Metin2 Drop Dosyaları: mob_drop_item ve special_item_group Biçimi (Server kurma)
- Metin2 Harita Ekleme: Sunucu ve Client Tarafı Adım Adım (Server kurma)
- Metin2 Açılmıyor ve İstemci Hataları: syserr.txt Nasıl Okunur? (Rehber)
Kategori: Server Kurma Kaynak Kod geliştirici hata syserr syslog sunucu
Bu sayfadaki bilgiler Metin2'nin sunucu yazılımındaki hesaplamalara ve standart oyun dosyalarına dayanır. Oyun dosyalarını değiştiren sunucularda değerler farklı olabilir. İçerikleri nasıl hazırlıyoruz?